我有一个对web的调用堆栈,需要异步调用。我从来没有用过它。
我创建了一个简单的测试控制台程序,大致如下:
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声明我应该使用“等待”操作符,因为目前这段代码将同步运行。接线员去哪儿了?
此外,如果下面的语句引发异常,如何在任务中捕获该异常
client.Repository.Get("openEHR", "CKM-mirror");发布于 2015-05-15 23:08:30
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 (或原始代码中的Result )进行操作。因为此时异常将被重新抛出。请注意,只有当异常在Task中抛出时,这才是正确的,理论上,Get函数本身可以抛出必须在那里捕获的抛出。
还请注意,由于要返回一个async,所以可以选择在调用的任何地方捕获异常。
最后,不要忘记,如果您不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.
}https://stackoverflow.com/questions/30269991
复制相似问题