【发布时间】:2013-09-18 20:19:24
【问题描述】:
我正在学习线程、任务和异步编码,并尝试将这些概念应用到我每天工作的 Web 窗体应用程序中。
到目前为止我有:
- 配置的服务参考如下:
-
更改的客户端调用来自
MyServiceClient msc = new MyServiceClient(); try { myData = msc.GetData(); msc.Close(); } catch (Exception) { msc.Abort(); throw; }
到
MyServiceClient msc = new MyServiceClient();
try
{
myData = msc.GetDataAsync().Result;
msc.Close();
}
catch (Exception)
{
msc.Abort();
throw;
}
我直接调用结果以在任务上隐式调用 .Wait() 并保持代码基本不变。
- 在执行 I/O 的同时释放应用程序池中的线程用于其他工作是否正确?
- 我需要以不同的方式处理异常吗?
- Close() 和 Abort() 是否仍然必要且相关?
【问题讨论】:
-
msc.GetDataAsync().Result;与msc.GetData();相同。不作为await msc.GetDataAsync();使用的Tasks是什么@ -
@I4V
msc.GetDataAsync().Result;与msc.GetData();不同。前者涉及两个线程后者只涉及一个。 -
@I4V 我不打算并行处理多个服务调用,我的目的是为其他工作释放线程。如果我使用
await,那么我需要将堆栈中的每个方法标记为async,这需要更多的工作。我可能会在走路之前尝试跑步,但这是我目前的理解。 -
@SriramSakthivel 当然它们不一样,我只是想说调用者线程将体验到的效果是一样的。 (BTW:Former理论上不需要涉及两个线程)
-
@mizzle 双向阻塞调用线程。我仍然没有看到使用
asynMethod.Result的优势
标签: c# wcf asynchronous