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

C# TPL异步静态方法调用线程安全,c#,asynchronous,thread-safety,task-parallel-library,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[]

我需要对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
实例。它们必须编写得很糟糕才能成为问题。)

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

另一方面,还不清楚为什么要在创建客户机之前声明return变量,并为其分配一个永远不会使用的值。更简单的代码:

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

示例中没有显式的共享状态。不知道SomeWcfClient做了什么。@JimMischel:没错,但是如果两个单独的实例不能从单独的线程调用,那么实际上所有的赌注都没有了。如果代码使用了
SomeWpfClient
的单个实例,那么这将是另一回事。我希望这段代码没有问题。另外,由于它是一个WCF客户端,并且假设
SomeWcfClient
是一个生成的代理,它应该使用
语句包装在
中。@JesseC.Slicer:我相信你的话。我不是WCF人员:)@ChrisHawkins:这不是服务问题,而是HTTP连接池问题。我建议您尝试一下,看看Wireshark或通过日志记录发生了什么。有一个app.config设置,您可以指定该设置以给出每台主机的连接限制;我一时记不起来了,但必要时我可以查一下。