2017-06-14 9 views
-2

私はバックグラウンドで作業する関数を呼び出す必要がありますが、終了すると "停止"して呼び出し元のスレッドで続行する必要があります。呼び出しスレッドに戻ることなく、バックグラウンドで関数を実行できますか?

現在、私は、このやっている:この場合

Task.Run(() => { MyFunction(); }); 
/* next code line */ 

をコードでは、バックグラウンドスレッドでMyFunctionを()を起動し、MyFunctionを()終了を待たずに次のコード行にその実行を継続する(私が欲しいもの)、MyFunction()が終了すると、スレッドに戻り、次のコード行(私が欲しくないもの)から続きます。したがって、次のコード行は、MyFunction()の起動直後とMyFunction()の終了後に2回実行されます。

次のコード行からコードを実行しないようにするにはどうすればよいですか?MyFunction()はそのタスクを完了した後ですか?

編集: 私が望むのは、バックグラウンドでMyFunctionを実行することです。待つ必要はありません。メインコードはMyFunction()を呼び出して、MyFunction()が終了するのを待たずにさらに進む必要があります。

+1

:ここ

は再現例です。あなたは '待っている'を探しているかもしれません。 – SLaks

+2

バックグラウンドタスクが終了したときに、呼び出したスレッドがすでに*実行していたコードと同じコードの実行を開始する*というアサーションもfalseです。それはスレッドの仕組みではありません。コードが複数回実行されている場合、呼び出し元のスレッドは、図示しないコードの結果として、明示的に複数回呼び出すことを行っています。 – Servy

+1

@SLaksいいえ、OPはバックグラウンドタスクを開始した後で(呼び出しが終了した後ではなく、 'await'のように)呼び出しスレッドが実行を継続したいと思っていると具体的に言いましたが、それは起こっていません*。 – Servy

答えて

0

あなたが提供したコードは、あなたがしたいことをすでにしています。動作が間違っていると思われる場合は、MyFunctionを見て、望ましくないことが起きているかどうか確認してください。スレッドが何を意味するのかまったく逆だ

private static void Main() 
{ 
    Console.WriteLine("Starting new task..."); 
    Task.Run(() => 
    { 
     Console.WriteLine(" - Task says 'Hello'"); 
     Thread.Sleep(TimeSpan.FromSeconds(3)); 
     Console.WriteLine(" - Task says 'Goodbye'"); 
    }); 
    Console.WriteLine("This line should not run twice."); 
    Console.WriteLine("Going to sleep while waiting for our task to finish..."); 
    Thread.Sleep(TimeSpan.FromSeconds(5)); 

    Console.WriteLine("\nDone!\nPress any key to exit..."); 
    Console.ReadKey(); 
} 

出力

enter image description here

+0

コードサンプルをありがとう!これは、問題が他の場所にあることを意味します。 ThreadクラスはUWPでは使用できませんが。 – Kibernetik

関連する問題