【发布时间】:2017-08-16 13:14:05
【问题描述】:
通常问题是主线程等待子线程,我可以在Task 上使用await。
但我有一种情况,子线程必须等待主线程中的某个方法完成才能继续。如何让这种交流成为可能?
public void MainThread()
{
Task t = Task.Run(ChildThread); //not using await because we want to continue doing work that must be only on the main thread
WorkA();
WorkB();
???
WorkC();
}
public async Task ChildThread()
{
WorkD();
???
Need_WorkB_ToBeCompletedBeforeThisOne();
}
WorkA WorkB WorkC 都必须在主线程上。在我的真实代码中,所有这些都是间接从子线程发出的,因为子线程需要它们完成但由于线程限制而无法完成。
我有办法让我的子线程告诉主线程已经开始工作(所以我将代码简化为您在此处看到的内容,一旦任务开始,工作将立即进行)但我需要一些方法发布者(子线程)了解这些命令的进度。
PS。感谢来自这个线程的答案,我为 Unity 创建了 CoroutineHost,您可以使用 await 可以从任何子线程向主线程发出的 yield IEnumerator 方法:https://github.com/5argon/E7Unity/tree/master/CoroutineHost
【问题讨论】:
-
为什么不让
ChildThread()只做WorkD()并返回,然后在MainThread()中使用await WorkB()并在此之后调用Need_WorkB...()? -
我的错,实际上 WorkA 到 C 将由
ChildThread()发出(因为如果 WorkA 到 C 在主线程以外的线程上执行,则存在软件限制)我想要一种方法在问题之后,ChildThread()可以得到某种关于主线程中事情进展的指示。
标签: c# multithreading task-parallel-library