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 回答