异步静态方法调用线程安全

本文关键字:安全 线程 调用 静态方法 异步 | 更新日期: 2023-09-27 18:10:26

我需要异步地对WCF服务进行四次调用,而线程安全与异步的东西和静态方法总是让我头疼。

这四个异步调用的静态方法应该是线程安全的,对吗?

    private void CheckStuff()
    {
        bool? res1, res2, res3, res4;
        // make 4 async calls to SomeServiceCall and wait for all
        Task[] tasks = new Task[]
                            {
                                Task.Factory.StartNew(() => res1 = SomeServiceCall("apple")),
                                Task.Factory.StartNew(() => res2 = SomeServiceCall("orange")),
                                Task.Factory.StartNew(() => res3 = SomeServiceCall("apple")),
                                Task.Factory.StartNew(() => res4 = SomeServiceCall("banana"))
                            };
        Task.WaitAll(tasks);
    }
    private static bool? SomeServiceCall(string someParam)
    {
        bool? retVal = null;
        var client = new SomeWcfClient();
        retVal = client.CheckSomething(someParam);
        return retVal;
    }

异步静态方法调用线程安全

是的-没有共享状态,所以应该没有线程安全问题。(编辑:正如评论中所指出的,这是假设可以同时从多个线程访问单独的 SomeWcfClient实例。它们必须写得很差,才会成为问题。)

您可能会发现通道在同一时间被限制为两个连接到同一主机/端口,但这是另一回事,只影响并行性,而不影响线程安全性。

顺便说一句,为什么要在创建客户端之前声明返回变量,并为其分配一个永远不会使用的值,这一点都不清楚。简单代码:

private static bool? SomeServiceCall(string someParam)
{
    var client = new SomeWcfClient();
    return client.CheckSomething(someParam);
}