【问题标题】:C# wait for thread to complete before continuingC#在继续之前等待线程完成
【发布时间】:2019-07-30 14:33:26
【问题描述】:

我有以下简化代码:

object myVariable;
var myThread = new Thread(async () =>
{
   //Do something....
   myVariable = //Some result....
});
myThread.Start();

我在方法的第一行开始myThread。我的理解是,该线程将关闭并执行,而该方法的其余部分同时执行。这是正确的吗?

然后在我的代码中到达一个点,在那里我将使用myVariable。鉴于此,如果 myThread 尚未完成,我需要暂停我的主线程。

我的理解是我可以使用myThread.Join() 来做到这一点。但是,一旦我调用.Join,它就会暂停主线程,直到myThread 完成。

我的问题是,如果我这样做:

开始myThread

那么

执行其他需要 x 秒的代码

那么

致电myThread.Join()

在这种情况下,在到达那行代码之前不会发生连接,例如,直到 x 秒后才会发生连接 - 或者连接是否提前?

我希望这个问题清楚吗?

【问题讨论】:

  • 如果myThread 已经完成,Join() 是空操作;如果没有,调用线程将阻塞当您调用Join - 这是否涵盖了它?
  • 是的,你是对的,它会像你写的那样表现

标签: c# multithreading concurrency


【解决方案1】:

我不知道我是否理解正确,但我会尽力回答你。 做你想做的事,你可以使用类似的东西:

await someMethod().ContinueWith((task) =>
                {
                    someOtherMethodThatUsesTaskResult(task.Result);
                    //more code    

                }, TaskContinuationOptions.OnlyOnRanToCompletion);

当然,您可以探索可用于最后一个参数的选项。

【讨论】:

  • 这是否会在新线程上运行该函数并因此同时运行?
  • @Alex 是的,它会的。不过,这个答案希望您使用任务而不是线程。但是,您应该真正使用任务而不是线程,因为任务更容易使用。 (只有很少的用例需要进行低级别以在任务上使用线程。)而不是var myThread = new Thread(() => { … });,您使用var myTask = Task.Run(() => { … });,这也比创建新线程更高效(如它从线程池中回收线程)。但是您应该阅读任务,await 和 async。
【解决方案2】:

在您的情况下,您可以使用关键字 await(我认为您的情况更好):

var myTask = asyncTask(); // Launch the Task

// execute other code that takes x seconds

var myVariable = await myTask; // Get the result of the Task (and wait if it was not finished)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    相关资源
    最近更新 更多