没有掌握 C# 中的 TASKs 和 WAIT
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();
}
}
与 class 定义为:
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" 运算符,因为目前此代码将 运行 同步。 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
。
关于异常处理的主题,您需要围绕 await
(或原始代码中的 Result
)执行 try
/catch
。因为那是异常将被重新抛出的时候。请注意,只有在 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.
}
我有一堆需要异步调用的 Web api 调用。我没用过aysnc.
我创建了一个简单的测试控制台程序,代码如下:
class Program
{
static void Main(string[] args)
{
ClassOne xx = new ClassOne();
var v1 = xx.DummyTask();
}
}
与 class 定义为:
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" 运算符,因为目前此代码将 运行 同步。 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
。
关于异常处理的主题,您需要围绕 await
(或原始代码中的 Result
)执行 try
/catch
。因为那是异常将被重新抛出的时候。请注意,只有在 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.
}