[英]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.