簡體   English   中英

我們還需要Richter的AsyncEnumerator嗎?

[英]Do we still need Richter's AsyncEnumerator?

最近我偶然發現了AsreyEnumerator類表格Jeffrey Richter的Power Threading Library,它似乎解決了我在編寫異步內容時經常遇到的幾個問題。

這個類的想法已經存在了很長一段時間了,我想知道當前版本的.NET / C#現在是否內置了對這種機制的支持,或者是否仍然需要依賴第三方庫? 或者也許新版本的.NET有一些替代方法可以像Richter的AsyncEnumerator那樣簡化異步編程?

或者換句話說:今天有沒有理由不開始使用Richter的AsyncEnumerator?

編輯:

一些鏈接與AsyncEnumerator的信息:

是的,您仍然可以從我的AsyncEnumerator中受益。 .NET 4(Tasks,Parallel,PLINQ等)中引入的新線程內容都是關於並發性的。 也就是說,它們都是關於計算工作量,將其分解並將其產生到多個線程上,以便工作負載可以在比1個線程完成整個工作負載所需的時間更短的時間內完成。 您可以使用這些構造同時執行多個同步I / O操作。 但是,同步I / O操作會導致所有線程被阻塞,從而導致線程池創建更多線程。 因此,當您的CPU使用率仍然很低時,您的應用程序的資源使用量會急劇上升。 這對於實現您的應用程序來說非常低效,並且會阻止您的應用擴展。

我的AsyncEnumerator就是在不阻塞任何線程的情況下啟動異步I / O操作,這樣您的應用程序的資源使用率仍然非常低,因此您的應用程序可以很好地擴展。 在這種情況下CPU使用率仍然很低,因為您正在執行I / O; 不是計算工作量。

在.NET的下一個版本中,新的async / await語言功能(我與Microsoft合作)使您能夠執行異步I / O,事實上,新功能的建模與我的AsyncEnumerator非常相似。 這么多,您可以將使用我的AsyncEnumerator的代碼移植到新模型,只需很少的源代碼更改。

正如其他人所指出的,我的AsyncEnumerator仍然提供其他功能,並且可以與.NET 2.0及更高版本一起使用。 因此,許多人在很長一段時間內仍然會發現它非常有用。

這里有一個明顯的平行點是PLINQ,但里希特本人對此表示不滿:

Jeffrey Richter 2008年12月4日下午2:27quotereply他們非常不同。 Parallel.For特別是關於執行一系列計算綁定操作,並行擴展到機器中的所有CPU。 我的AsyncEnumerator主要是發出一個或多個並發I / O綁定操作,而沒有任何線程阻止它們完成。

但是,C# async CTP在這里可能很有用,使線程延續更加合理,即

var bytesRead = await stream.ReadAsync(...);
Console.WriteLine(bytesRead); // woah! we're on a different thread now!

在這里,C#編譯器會重新編寫await實例的所有內容,這樣它就會成為現有異步操作(必須返回“等待”值)的回調/延續。 一旦這個生產,我希望這將成為一種更自然的方式來編寫由於異步導致內在延遲的代碼。

.net 4.0包括PLINQ框架和各種其他線程計算方法。

有關更多詳細信息,請參閱.NET Framework中的並行編程

從這個問題異步迭代器任務<IEnumerable <T >>

聽起來你可能正在尋找的東西就像IObservable <T> ,它有點像基於推送的異步IEnumerable <T>。 請參閱Microsoft Open Technologies的Rex Extensions,即來自Microsoft Open Technologies的許可證(在Apache-2.0下獲得許可的代碼)(無聯屬關系),這些方法適用於IObservable <T>,使其像LINQ-to-Objects一樣工作。

IEnumerable <T>的問題在於,沒有什么能真正使枚舉本身異步。 如果您不想在Rx上添加依賴項(這實際上是使IObservable <T>閃耀的原因),則此替代方案可能對您有用:

public async Task<IEnumerable<char>> TestAsync(string testString)
{
    return GetChars(testString);
}

private static IEnumerable<char> GetChars(string testString)
{
    foreach (char c in testString.ToCharArray())
    {
        // do other work
        yield return c;
    }
}

雖然我想指出,如果不知道實際上異步做什么,可能會有更好的方法來實現你的目標。 您發布的代碼中沒有一個實際上會異步執行任何操作,而且我真的不知道// do other work任何// do other work是否異步(在這種情況下,這不是解決您的基本問題,盡管它會使您的代碼編譯)。

暫無
暫無

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

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