[英]Not getting the hang of TASKs and WAIT in C#
我有一堆对Web api的调用,这些调用需要异步调用。 我从未使用过aysnc。
我已经按照以下方式创建了一个简单的测试控制台程序:
class Program
{
static void Main(string[] args)
{
ClassOne xx = new ClassOne();
var v1 = xx.DummyTask();
}
}
该类定义为:
namespace GHTest.classes
{
public class ClassOne
{
GitHubClient client;
public ClassOne()
{
client = new GitHubClient(new ProductHeaderValue("OMHSite"));
}
public async Task<string> DummyTask()
{
Task<Repository> task = client.Repository.Get("openEHR", "CKM-mirror");
task.Wait();
var myResult = task.Result;
return myResult.FullName;
}
}
}
Visual Studio指出我应该使用“ await”运算符,因为当前此代码将同步运行。 等待操作员去哪里?
此外,如果以下语句引发异常,我该如何在任务中捕获该异常
client.Repository.Get("openEHR", "CKM-mirror");
task.Wait();
如果是多余的,则对task.Result
的调用将隐式等待。
这是您改写为使用await
方法。
Task<Repository> task = client.Repository.Get("openEHR", "CKM-mirror");
var myResult = await task;
return myResult.FullName;
您不需要.Result
,因为Task<T>
上的await
类型为T
关于异常处理,您将需要try
/ catch
await
(或原始代码中的Result
)。 这样一来,异常将被重新抛出。 请注意,只有在Task
抛出异常时,这才是正确的,从理论上讲, Get
函数本身可能会抛出该异常,而该异常必须在此处捕获。
还要注意,由于您要返回async
您可以选择在await
调用(或Result
)的任何地方捕获异常。
最后,不要忘记,如果您不await
DummyTask
的结果, DummyTask
您的任务可能不会完成(或Result
)。
static void Main(string[] args)
{
ClassOne xx = new ClassOne();
var v1 = xx.DummyTask();
var resultV1 = v1.Result; //Forces the execution of v1 by requesting its result.
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.