为什么 Task.Wait() 导致应用程序冻结

Why is Task.Wait() causing application to freeze

当我调用 BuildCustomer.StartTask 时,我会调用 WriteToDatabase 方法。在 WriteToDatabase 内部,我想将状态发送回 MainForm 以将状态写入 GUI。当代码到达那个点时,我的应用程序冻结并且没有给出任何错误。我确实发现,如果我删除 task.Wait(),它就会停止冻结并开始工作。但我认为我需要等待,因为我的 BuildCustomer 需要一些时间并向 GUI 写入大量更新(包括来自 Common class 的更多更新)。有人可以告诉我哪里出了问题或者我应该做些什么不同的事情吗?这是一个 .Net 4 项目,所以我不能使用异步,我已经看到了其他答案。

public partial class MainForm : Window
{
    public MainForm()
    {
        Common.SendMessage += UpdateStatus;
    }

    private void Button_Click(object sender, EventArgs e)
    {
        BuildCustomer.StartTask();
    }

    private void UpdateStatus(string message)
    {
        Dispatcher.Invoke(new Action(() =>
        {
            StatusTextBox.Text = message;
        }));
    }
}

public class BuildCustomer
{
    public static void StartTask()
    {
        var action = new Action<object>(BuildCustomer);

        var task = new Task(() => action(buildDetails));

        task.Start();

        task.Wait();
    }

    private void BuildCustomerDetails(object buildDetails)
    {
        Common.WriteToDatabase();
    }
}

public class Common
{
    public delegate void MessageLogDelegate(string message);

    public static event MessageLogDelegate SendMessage;

    public static void WriteToDatabase()
    {
        SendMessage("Some status message to write back to the GUI");
    }
}

你遇到了僵局。 StartTask 等待 task.Wait() 完成,但这发生(被调用)在主 UI 线程的调用线程上。

正在等待的 Task 最终到达 UpdateStatus,它也在 UI 线程上调用调用,但该线程当前正在等待 task.Wait()所以它是阻塞的,导致 UI 线程无法无限期地使用 )。

尝试将 async 关键字添加到方法签名并使用它:

await task;

它导致不休眠主线程(UI线程)。