免責事項1:私はマルチスレッドのコンセプトを理解していますが、正しい実装はまだ私を逃しています。スレッドはまだ実行中ですか、それともLINQPadですか?
免責事項2: LINQPadを批判しているわけではありません。驚くべきことです。私は何かが欠落しているかどうかを調べようとしているだけです。
Console.WriteLine("Completed");
が呼び出されたときに、スレッドがまだ実行されていますか?
私はLINQPadで実行したときに、私は右下隅にあるすべてのスレッドをキャンセルするCtrlキーを押しながら+ Shiftキー+ F5を参照してくださいので、私は、私はVSを通じてコンソールアプリケーションと同じコードを実行すると、それはそう、しかし、頼みます終了します。タスクを正しく使用していない、または正しく終了していない可能性があります。あなたは、Visual Studioでビルドする通常の実行ファイルとは異なり
public class TaskRunner
{
public async void RunTasks()
{
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken ct = cts.Token;
Task loadingTask =
new Task(() =>
{
//do something that takes a while, ie. database or service call
for (int i = 0; i < 10; i++)
{
Thread.Sleep(100);
Console.WriteLine("Loading");
}
});
Task entertainmentTask =
new Task(() =>
{
//do something until told to stop to keep user entertained
while (true)
{
if (ct.IsCancellationRequested)
{
break;
}
Console.WriteLine("Entertainment");
Thread.Sleep(50);
}
}, ct);
loadingTask.Start();
entertainmentTask.Start();
await Task.WhenAny(loadingTask, entertainmentTask);
cts.Cancel();
Console.WriteLine("Completed");
}
}
私はそれを別の言葉で言いたいと思います。 Console.WriteLine( "Completed")がヒットした場合、プログラムは従来の実行可能ファイルで実行されますが、LINQPadは将来スレッドを最適化するためにスレッドを有効に保ちます。 –
これは正しいです。従来の実行可能ファイルでは、すべてのフォアグラウンドスレッドが完了すると、すべてのバックグラウンドスレッドが終了します。メインスレッドはフォアグラウンドスレッドであり、タスクは別途指示がない限りバックグラウンドスレッドを使用します。 –