【发布时间】:2016-03-04 23:48:19
【问题描述】:
考虑这种方法:
//Called on a known thread
public async void ThreadSleep()
{
while(itemsInQueue)
{
//This call is currently on Thread X
await Task.Delay(5000);
//This needs to be on the thread that the method was called on
DoSomeProcessing();
}
}
我假设 Task.Delay 在不同的线程上执行异步并在同一个线程上恢复。这对我来说不是很明显。如何让方法在 Thread X 上继续?
PS:ThreadSleep 方法在非 UI 线程上执行
编辑:1) 为简单起见,添加了 W.Brian 的代码示例。
2) 是的,这个例子正是……一个例子。
3) Thread.Delay 的目的只是在处理之间增加一些延迟。
【问题讨论】:
-
为什么要继续调用线程?
-
@svick:我为什么不想要它?数据同步一个。重入问题。我可以想到很多原因,为什么对方法的调用需要在预先确定的线程上。
-
您列出的所有内容都已通过正确返回
async Task而不是async void得到修复。 You should never return async void unless you are doing it to be compatible with a event handler。如果我不正确,您能否用一个示例更新您的问题,您需要它位于同一个线程上(并且该线程不是 UI 线程)。 -
好吧,它并没有修复这个人为的例子,它修复了数据同步和重入问题,尽管这就是你告诉 svick 你为什么需要它的原因。如果您可以发布一个为什么需要它的真实示例,我可以发布一个答案,解释如何做到这一点或解决方法将如何实现相同的目标。我不能用你当前的例子来做,因为我不知道
DoSomeProcessing()后面的“为什么”每次都必须在同一个非 UI 线程上,如果我知道要求的原因,我可以满足要求。 -
@bobbyalex 我对你的问题投了反对票,因为你要求的东西通常是一种不好的做法,而没有给出任何理由说明为什么它对你的情况有意义。这也让你的问题听起来像the XY problem。