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

时间:2011-10-05 16:15:51

标签: c# asynchronous thread-safety task-parallel-library

我需要异步地对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;
    }

1 个答案:

答案 0 :(得分:2)

是 - 没有共享状态,因此不存在线程安全问题。 (编辑:正如评论中所指出的那样,假设可以同时从多个线程访问单独的 SomeWcfClient实例。他们必须写得不好才能成为问题。)< / p>

您可能会发现通道一次只能连接到同一主机/端口的两个连接,但这是一个单独的问题,只会影响并行性,而不会影响线程的安全性。

顺便说一下,为什么你想在创建客户端之前声明返回变量,并为它赋予一个永远不会被使用的值,这一点都不清楚。更简单的代码:

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