摘要:[002][Concurrency in C# CookBook]如何提早執行(偷跑)非同步方法
下面的範例可以提早幾行程式碼偷跑比較費時間的非同步方法,而後續的await關鍵字出現的時候,才會去把Task的結果取回,才會throw出exception(Task若是有執行錯誤的話拉)
protected async void btnNotSupportedExceptionThrowLater_Click(object sender, EventArgs e)
{
long longSum = 0;
longSum = await TrySomethingAsyncThrowLater();
Page.ClientScript.RegisterStartupScript(this.GetType(), "", "alert('sum=" + longSum.ToString() + "');", true);
}
private async Task TrySomethingAsyncThrowLater()
{
long longSum = 0;
//假設下面這行很快執行完畢,但也不會馬上return value,但是就是提早偷跑了,不會拖到try{}裡面才開始跑
//假設下面這行執行PossibleExceptionAsync時發生錯誤,但是不會在這行立刻丟出exception
Task t = PossibleExceptionAsync();
//如果這邊有一個很浪費時間的工作,那上面的非同步function偷跑的技巧就很適合使用
for(long i=0;i<3000000;i++)
{
i=i+1;
}
try
{
//會等到await關鍵字出現時,才會確實取得return value
//會等到await關鍵字出現時,才會throw
longSum = await t;
//原本的寫法是這樣....
//longSum = await PossibleExceptionAsync();
}
catch (Exception ex)
{
//只會進來這個exception...自己新增一般exception進來這邊自high一下 XD
string strErrMsg = ex.ToString();
return 0;
}
return longSum;
}
大概是這樣...