簡體   English   中英

異步調用同步方法

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM