[英]calling a synchronous method asynchronously
我有一個簡單的代碼,試圖在其中更好地了解如何在C#中異步調用方法。
我有一個叫Function1的函數,我想異步運行
static void Function1(out int threadId)
{
Console.WriteLine("I'm inside Function 1. Going to sleep for 7 seconds...");
Thread.Sleep(7000);
Console.WriteLine("I'm awake now");
threadId = Thread.CurrentThread.ManagedThreadId;
}
然后我有第二個函數Function2,我想正常運行(同步)
static void Function2()
{
Thread.Sleep(3000);
Console.WriteLine("I'm inside Function 2");
}
我還創建了一個與Function1具有相同方法簽名的委托
delegate void AsyncMethodCaller(out int threadId);
這是我的主要調用方法:
static void Main(string[] args)
{
int threadId;
AsyncMethodCaller caller = new AsyncMethodCaller(Function1);
caller.BeginInvoke(out threadId, null, null);
Function2();
}
在我的主要方法中,我希望Function1開始異步運行; 然后不等待它完成就執行Function2。 所以我期望以下輸出:
我在異步函數1中。要睡眠7秒鍾...
我在功能2中
我現在醒了
相反,我得到以下輸出:
我在異步函數1中。要睡眠7秒鍾...
我在功能2中
為什么我的期望與現實不同? 為什么從未達到“我現在醒着”行?
謝謝
.NET的基本進程生存期規則是,所有前台線程都退出后,進程退出。 任何后台線程都會被簡單地中止; 該過程不會等待他們。
此外,當您調用委托的BeginInvoke()
方法時,這將隱式導致使用線程池調用委托。 線程池完全由后台線程組成。
換句話說,當您調用BeginInvoke()
,您是在告訴.NET使用不會本身保證其壽命的線程來調用委托。 一旦進程的單個主前台線程退出,該線程就可以(在這種情況下)中止Function2()
在調用Function2()
之后立即發生Function2()
。
如果希望異步調用的委托正常完成,則必須顯式等待。 例如:
IAsyncResult result = caller.BeginInvoke(out threadId, null, null);
Function2();
caller.EndInvoke(out threadId, result);
EndInvoke()
方法將阻塞,直到異步調用的委托完成為止,從而允許主線程等待該委托的發生,從而確保在調用完成之前不會中斷用於調用委托的線程。
您的代碼示例的結構表明您已經看過MSDN的異步調用同步方法 ,但是如果您沒有,我將不提及該頁面,因為該頁面包含許多細節,將有助於解釋如何處理該特定問題。場景。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.