在敲了一个简短的测试应用程序之后,似乎当一个 WCF 客户端被释放时,它会等待所有异步任务完成后再实际释放。
示例 WCF 服务:
public class Service1 : IService1
{
public string GetData(int value)
{
Thread.Sleep(5000);
return "GOT HERE " + value;
}
}
示例客户端:
class Program
{
static void Main(string[] args)
{
using (var wrapper = new Wrapper())
{
wrapper.DoSomething();
}
Console.WriteLine("Finished.");
Console.ReadLine();
}
}
class Wrapper : IDisposable
{
public void DoSomething()
{
Task<string> task1;
using (var client = new ServiceReference1.Service1Client())
{
task1 = client.GetDataAsync(1);
var task2 = client.GetDataAsync(2);
Thread.Sleep(1000);
var task3 = client.GetDataAsync(3);
Console.WriteLine("Calls started");
}
Console.WriteLine("Result of task 1:" + task1.Result);
}
public void Dispose()
{
}
}
在这种情况下,“呼叫开始”行会在 1 秒延迟后出现。“完成”。在所有三个任务都成功完成之前,不会写入行。
因此,实际上 WCF 服务客户端包装器管理其任务并在处理之前等待完成(或可能是超时)。
...这让我想到:如果您想以“即发即弃”的异步方式调用长时间运行的 WCF 方法,您要么必须在没有using
块的情况下执行此操作,要么将整个事情包装在自己的任务中。所以这是很多包装!