async operation的結果能否返回到啓動它的線程(即在原始線程中調用AsyncCallback
)?將異步操作結果返回到原始線程
下面是一個例子
void Main(string[] args)
{
Func<bool> action =() =>
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Running");
return true;
};
AsyncCallback onComplete = (r) =>
{
bool result = action.EndInvoke(r);
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Completed");
};
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Main");
IAsyncResult iar = action.BeginInvoke(onComplete, null);
}
它的輸出是一樣的東西:
5: Main
6: Running
6: Completed
我想達成什麼是onComplete
回調在主線程(如已完成,並主要將執行。在這個例子中印有相同的線程ID)
(我知道這可以通過BackgroundWorker
來實現,即它是RunWorkerCompleted
事件在原始線程中觸發,因此在後臺線程中調用的函數的返回值可以返回到原始線程)
那麼爲什麼不使用BackgroundWorker呢?它不是密封的,所以你甚至可以從它中派生出來添加你自己的魔法。 – Nebula
交談中,您可能可以發送對主線程的引用以及任務並跨線程訪問它。但要測試並確保它始終有效? Brrr ... – Nebula
@Nebula對'Thread'的訪問不允許你將* work *推送到一個線程;爲此,您需要某種工作隊列機制。 –