gpt4 book ai didi

c# - 当客户端处置或超出范围时,异步 WCF 调用会发生什么情况?

转载 作者:太空狗 更新时间:2023-10-29 23:08:11 27 4
gpt4 key购买 nike

我正在维护一些代码,其中有一个类包含一个使用任务模式异步调用 WCF 方法的方法。

代码看起来像这样:

public class Manager : IDisposable
{
public void DoSomething()
{
Task<bool> task;

using (var client = new WcfClient())
{
task = client.ReallyDoSomethingAsync(123);
}
}
}

管理器本身在另一段代码的其他地方使用,该代码将对 DoSomething 的调用包装在 using(Manager) block 中。

所以我的问题是,WCF 调用会发生什么情况。它发生了吗?它放弃了吗?

更一般地说,这是否适用于使用 Task<T> 的异步调用?图案?如果所属类在异步调用完成之前超出范围会怎样?

最佳答案

在启动一个简短的测试应用程序后,似乎在处置 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 block 的情况下执行此操作,要么将整个事情包装在自己的任务中。所以这是很多包装!

关于c# - 当客户端处置或超出范围时,异步 WCF 调用会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19001178/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com