2012-04-20 33 views
0

私はWinRTのにはいくつかのC#.NETコードを移植していると私は、次の交換方法を考え出すトラブルを抱えていますのを待ち:/停止を起動する方法/スレッド

bool threadDone = false; 
Thread updateThread = null; 

void StartUpdateThread() { 
    threadDone = false; 
    updateThread = new Thread(new ThreadStart(SendUpdateThread)); 
    updateThread.Start(); 
} 

void StopUpdateThread() { 
    if (updateThread == null) return; 
    threadDone = true; 
    updateThread.Join(); 
    updateThread = null; 
} 

void SendUpdateThread() { 
    while(!threadDone) { 
    ... 
    Thread.Sleep(...); 
    } 
} 

交換するための最良の方法は何ですかこれはWinRTでThreadPool.RunAsync(...)を実行してコードを実行してみましたが、StopUpdateThreadでその完了を待つのが最善であるとは思えません。また、私のスレッド機能で睡眠をどのように置き換えるのですか?

+2

スレッドが終了しました!長いライブスレッド! –

+0

それでは、私は何と置き換えますか?本質的に、定期的に(Nミリ秒ごとに)アップデートを送信したいと思います。 WinRTでこれを行うより良い方法はありますか? –

+0

些細な非同期/待機応答を取得することは、それ以上の情報なしでは難しい質問です。誰に更新を送信しますか?あなたが墓石になったり予期せずシャットダウンしたときに何をしますか –

答えて

2

我々はC#5 GUIアプリケーションの話をしているので、あなたは何をブロックし、Task Sを使用してasyncなかった場合、それはおそらく最高のだろう - その代わりawait。すなわち、このようなものになります:

// I think this field needs to be volatile even in your version 
volatile bool taskDone = false; 
Task updateTask = null; 

void StartUpdateTask() { 
    taskDone = false; 
    updateTask = Task.Run(SendUpdateTask); 
} 

async Task StopUpdateTask() { 
    if (updateTask == null) return; 
    taskDone = true; 
    await updateTask; 
    updateTask = null; 
} 

async Task SendUpdateTask() { 
    while (!taskDone) { 
    ... 
    await Task.Delay(…); 
    } 
} 

をしかし正しく、このコードを使用するには、実際にasyncかを理解する必要がある - awaitはありませんので、あなたはそれについてまでお読みください。

また、これはあなたが必要とするものではないかもしれませんが、あなたの質問の情報だけに基づいて知るのは難しいです。

+0

気まぐれな提案をありがとう。 –

+0

コンパイルするためには、私は次のことを行う必要がありました。updateTask = Task.Run((Func )SendUpdateThread); –

関連する問題