2017-01-19 21 views
2

.NETコアにはDispatcherのようなものがありますか?.NETディスパッチャ、.NETコア用?

.NETコアでスレッドを作成し、そのスレッドで呼び出されるアクションを送信する必要があります。また、私はasync/awaitもののために使用することができるTaskSchedulerを使用できるようにしたいと思います。

これはどこかに存在しますか?

+1

ここでは研究の証拠はありません。あなたはいくつかのリンクを提供し、彼らがあなたを助けなかった方法を説明できますか? –

+0

AFAIK Task.Runはまだそこにいて、うまく機能するはずです。既に試しましたか?ディスパッチャーは、GUIアプリケーションのようなものにとっては大いに重要です。 – Clint

+0

'' 'WindowsBase'''(' '' Dispatcher''')は.NETコアでは実行されず、通常のCLRだけが実行されます。 –

答えて

1

これは内蔵されていませんが、私のAsyncContext and AsyncContextThread typesはあなたのニーズに合ったライブラリで利用できます。

AsyncContextは、現在のスレッドを引き継ぐ:

AsyncContext.Run(async() => 
{ 
    ... // any awaits in here resume on the same thread. 
}); 
// `Run` blocks until all async work is done. 

AsyncContextThreadAsyncContextそれ自身と別のスレッドである:

using (var thread = new AsyncContextThread()) 
{ 
    // Queue work to the thread. 
    thread.Factory.Run(async() => 
    { 
    ... // any awaits in here resume on the same thread. 
    }); 
    await thread.JoinAsync(); // or `thread.Join();` 
} 

AsyncContextSynchronizationContextを提供するだけでなく、TaskScheduler/TaskFactory

+0

だから、 '' AsyncCOntext.Run'''の内部にあるコンソールアプリケーションで "UI"スレッドを実行するのをやめたいのであれば、 '' 'SynchronizationContext'''を取得し、' ' 'while(!exit){Task.Yeild();を待ちます。 } '' '?次に、 '' 'SynchronizationContext'''を使用して、そのスレッド上で実行されるタスクをスケジュールするために使用できますか? –

+0

@PaulKnopf:作業待ちの別のスレッドが必要な場合は、次のように 'AsyncContextThread'を使うことをお勧めします。 'SynchronizationContext'をキャプチャする必要はありません。キュー操作に' AsyncContextThread.Factory'を使用するだけです。'while'は必要ありません - スレッドは' Join'/'JoinAsync' /' Dispose'が呼び出されるまで、より多くの作業を待っています。 –

+0

美しい!ありがとう、非常に感謝! –