2017-09-29 5 views
0

次のコードは99%の例外をスローします。Task.Runで新しいスレッドを作成する方法を教えてください。

Task.Runで新しいスレッドを確実に作成するにはどうすればよいですか?

int e; 
void Main() 
{ 
    Task.Run(() => 
    { 
     e = Thread.CurrentThread.ManagedThreadId; 
     Task.Run(() => {CheckThread();}).Wait(); 
    }).Wait(); 

    Console.WriteLine("finish"); 
} 

void CheckThread() 
{ 
    if(e == Thread.CurrentThread.ManagedThreadId) 
    { 
     throw new Exception("Error: " + Thread.CurrentThread.ManagedThreadId); 
    } 
} 
+0

が完了したときに知っているタスクを使用すると、あなたが気に思いながら、これを行うには

一つの方法を自分で作成する必要があります。あなたが得る例外は私たちと共有していますか?また、タスクとスレッドは2つの異なるものです。トピックについて少しお読みになることをお勧めしますhttps://stackoverflow.com/questions/4130194/what-is-the-difference-between-task-and-thread – Yarimi

+0

前のタスクに同じスレッドがある場合、彼は例外をスローしますIDを内部で呼び出すタスクとして使用します。問題はおそらく新しいスレッドでタスクが作成されますが、十分な作業をしていないために2番目のタスクで新しいスレッドが作成されないためです。この例では両方のタスクが必要かどうかわかりません。 –

+2

ここで使用されているスレッドプールスレッドに問題があります。なぜ、これらの2つの操作に対して異なるスレッドプールスレッドがあることが重要ですか?このコードで何かをやっているのであれば、あなたがここで別のスレッドを持っていることが必須*になります。それは問題であり、おそらく再設計されるはずです。もちろん、同じスレッドを使用してコードに依存するべきではありません。同じスレッドまたは異なるスレッドが使用されているかどうかにかかわらず、両立しないように設計する必要があります。 – Servy

答えて

-1

このコードは、新しいスレッド

var t = new Task(CheckThread, TaskCreationOptions.LongRunning); 
t.Start(); 
t.Wait(); 

でのタスクのコードを実行します。しかし、これは動作がを文書化されていないあることに注意してくださいます。あなたがスレッドを作成していることを確認したいのであれば、あなたは1にスレッドが

var tcs = new TaskCompletionSource<object>(); 
var thread = new Thread(() => 
{ 
    CheckThread(); 
    tcs.SetResult(null); 
}); 
thread.Start(); 
tcs.Task.Wait(); 
+1

なぜdownvote?私はOPの質問に答えました。あなたのフィードバックを提供して、他の人が回答を改善できるようにしてください –

関連する問題