2016-08-22 7 views
-3
using System; 
using System.IO; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 

public class Program 
{ 
    public static void Main(string[] args) 
    { 
    Read(File.OpenText("test.txt")); // content: "read from file" 
    Read(new StreamReader(new MemoryStream(
     Encoding.UTF8.GetBytes("read from string"))); 
    Console.WriteLine("{0}: {1}", 
     Thread.CurrentThread.ManagedThreadId, "main thread"); 
    Console.ReadKey(); 
    } 
    static async Task Read(StreamReader sr) 
    { 
    var s = await sr.ReadToEndAsync(); 
    Console.WriteLine("{0}: {1}", 
     Thread.CurrentThread.ManagedThreadId, s); 
    } 
} 

出力:スレッドは "DoSthAsync待つ" に予定されている方法

3:ファイルから読み込む

1:文字列

1から読んで:メインスレッド

以上、は新しいスレッドを作成しますが、read from stringを作成しないのはなぜですか?

具体的には、非同期ファイルIOで新しいスレッドを完了する必要があるのはなぜですか?

基礎となる同期ファイルIOのラップされたバージョンだけですか?新しいスレッドを生成することによってディスパッチされますか?

+0

私は、MemoryStreamからの読み込みについて本質的に非同期なものはないので、別のスレッドに送信する実際の作業はないという簡単な答えがあります。 –

+2

あなたが探しているのは、C#の 'async' /' await'機能に関する完全なチュートリアルです。お気に入りのウェブ検索エンジンを使用して、これらのキーワードが何をするかを記述する1つまたは複数の_many_記事を検索する必要があります。これまでのコメントでは、ここでの特定の動作をまとめています。メモリ内のオブジェクトからの読み込みは同期的に完了できるため、別のスレッドに巻き込まれることはありません。 –

答えて

2

なぜread from fileは新しいスレッドを作成しますが、read from stringを作成しないのですか?実際には、新しいスレッドが作成されていない、または"there is no thread"を言うのが好き私の友人ステファン・クリアリーとして -

は、これらの呼び出しのどちらが新しいスレッドを生成している、ここで私は明確ましょう。

なぜ非同期ファイルIOで新しいスレッドを完了する必要がありますか?

ここで、スレッド識別子が異なる理由は、これらの呼び出しの1つが実際にファイルを開いたままにしているためです。 .NET Fiddleを作成しました。これは、async呼び出しがスレッドIDを完了するために正しく待機するかどうかにかかわらず、依然として変化することを示しています。手がかりはStreamReaderのソースコードに埋め込まれています。 .ctor(string path)は最終的にleaveOpenのパラメータにtrueを渡しますが、.ctor(Stream stream)はそのパラメータに対してfalseを渡します。 2つのコンストラクタパスhereを見てください。

前述の記事から引用: ライブラリ/ BCLは、標準的なP /呼び出しを使用しているためにI/Oシステムを重ね、それが既にされており、I/O完了ポート(IOCP)でハンドルを登録しましたスレッドプールの一部。そのため、I/Oスレッドプールスレッドは、タスクが完了したことを通知するAPCを実行するために短時間借用されます。

更新

私は再びそれを実行し、これは結果.NET Fiddleた:これは私に言っているように見えること

enter image description here

ことの一つは、その2以来のことです実際にはファイルシステムに書き込むことは本当にI/Oバウンド操作ですが、もう一方は単純にメモリ内にあります。それがあなたのために物事を明確にするのに役立つかどうかは分かりませんか?

+0

+1私はスタックオーバーフローが投稿する前に、[c#] [async-await]質問を掲示する誰かが「スレッドがありません」と読む必要があるとほとんど感じています。その投稿で私が答えた質問の数が私の心を揺さぶる。 – Aron

+0

'ctor'が' new StreamReader(File.Create( "test.txt")) 'によって' FileStream'を受け取るように変更されたとしても、新しいスレッドは作成されます。 – sof

+0

私は予想される動作を見ています、ここには[.NET Fiddle](https://dotnetfiddle.net/ueBK15)があります。 –

関連する問題