异步静态方法调用线程安全
本文关键字:安全 线程 调用 静态方法 异步 | 更新日期: 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);
}