簡體   English   中英

C#異步函數線程

[英]C# Asynchronous Function Threading

測驗

我有一個函數f1(string,string),它需要4秒鍾來執行(與它的功能無關)。 通過在main中調用f1(“ a”,“ b”)對此進行了測試。

呼喚

Console.WriteLine(f1("a", "b")); 
Console.WriteLine(f1("a", "b")); 

將等待4秒鍾,以便第一個功能完成,提示返回,再等待4秒鍾,提示第二個結果一切正常。

我嘗試通過使用lambda創建兩個單獨的匿名線程來並行執行此操作,如下所示:

new Thread(() => {Console.WriteLine(f1("a", "b")); }).Start();
new Thread(() => {Console.WriteLine(f1("a", "b")); }).Start();

由於我具有雙核處理器,並且功能處理繁重(OS很好地平衡了這一點),所以我在4秒(而不是8秒)后得到了兩個提示,因此我知道它可以並行工作。

我怎么能寫一個函數f1Async(string,string),盡管每次都在不同的線程上,它最初會調用f1(string,string)(就像我在main中手動完成的那樣)? 為了知道f1Async的輸出是什么,我必須等待線程完成,因此連續兩次調用f1Async()將導致該函數在進入第二個調用之前等待一個線程完成。

我認為您正在尋找Parallel.For 它將並行運行一個動作的多個迭代,並等待所有迭代完成。

如果要在繼續之前異步運行f1兩次,請執行以下操作:

Parallel.For(0, 2, i => Console.WriteLine(f1("a", "b")));

請記住,異步數據輸出可能會導致數據混亂。 您可能應該lock Console.WriteLine以確保線程安全:

object synchro = new object();
Parallel.For(0, 2, i =>
{
    var output = f1("a", "b");
    lock (synchro)
    {
        Console.WriteLine(output);
    }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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