[002][Concurrency in C# CookBook]如何提早執行(偷跑)非同步方法

  • 10009
  • 0
  • 2015-11-23

摘要:[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;
}

大概是這樣...