BEN*_*der 0 c# asynchronous task async-await openehr
我有一堆需要异步调用的web api调用.我从未使用过aysnc.
我创建了一个简单的测试控制台程序,类似于:
class Program
{
static void Main(string[] args)
{
ClassOne xx = new ClassOne();
var v1 = xx.DummyTask();
}
}
Run Code Online (Sandbox Code Playgroud)
将类定义为:
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Visual Studio声明我应该使用"await"运算符,因为此代码将同步运行.等待运营商在哪里?
此外,如果以下语句抛出异常,我如何在任务中捕获它
client.Repository.Get("openEHR", "CKM-mirror");
Run Code Online (Sandbox Code Playgroud)
task.Wait();是还原剂,调用task.Result会隐含地等待.
这是您重写使用的方法await.
Task<Repository> task = client.Repository.Get("openEHR", "CKM-mirror");
var myResult = await task;
return myResult.FullName;
Run Code Online (Sandbox Code Playgroud)
你不需要.Result任何的类型await上Task<T>是T.
在异常处理的主题,你需要做一个try/ catch周围的await(或Result在原始代码).因为那时异常将被重新抛出.请注意,只有在抛出异常时才会出现这种情况Task,理论上Get函数本身可能会抛出必须捕获的异常.
另请注意,既然您正在返回,async您可以选择在您await(或Result)呼叫的任何地方捕获异常.
最后不要忘记,如果你不这样做await,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.
}
Run Code Online (Sandbox Code Playgroud)