简体   繁体   中英

How to Start/Stop/Wait for a Thread

I am porting some C# .Net code to WinRT and I am having trouble figuring out how to replace the following:

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(...);
  }
}

What is the best way to replace this in WinRT. I have looked at ThreadPool.RunAsync(...) to start the code running, but I am not sure of the best wait to stop it and wait for its completion in StopUpdateThread. Also, what do I replace the sleep with in my thread function?

Since we're talking about C# 5 GUI application, it would be probably best if you didn't block anything and used Task s and async - await instead. That could look something like this:

// 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(…);
  }
}

But to use this code correctly, you actually need to understand what async - await does, so you should read up about that.

Also, this might not be exactly what you need, but that's hard to know based just on the information in your question.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM