0

いくつかのC#.NetコードをWinRTに移植していますが、次のものを置き換える方法を理解するのに問題があります。

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で完了するのを待つのに最適な待機方法がわかりません。また、スレッド関数でスリープを何に置き換えますか?

4

1 に答える 1

2

C#5 GUIアプリケーションについて話しているので、何もブロックせず、代わりにTasksと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が何をするのかを理解する必要があるので、それについて読む必要があります。

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

于 2012-04-20T00:51:06.167 に答える