C# 我可以在userControl中使用线程来防止应用程序运行时挂起吗?

C# 我可以在userControl中使用线程来防止应用程序运行时挂起吗?,c#,multithreading,user-interface,user-controls,C#,Multithreading,User Interface,User Controls,我在C中设计了一个WPF。userControl类包含一个名为MainProgram的方法,该方法计算昂贵的操作。为了防止应用程序运行时挂起UI,我决定使用线程。我想使用基于任务的异步模式TAP和异步等待关键字 以下是算法的伪代码: private void StartSearch_Click(object sender, EventArgs e) { textBoxLog.AppendText("Program Start"); globalSetter(); Main

我在C中设计了一个WPF。userControl类包含一个名为MainProgram的方法,该方法计算昂贵的操作。为了防止应用程序运行时挂起UI,我决定使用线程。我想使用基于任务的异步模式TAP和异步等待关键字

以下是算法的伪代码:

private void StartSearch_Click(object sender, EventArgs e)
{
    textBoxLog.AppendText("Program Start");
    globalSetter();
    MainProgram();  
}
在程序中,用户应填写表单,在UI中包含一些文本框,然后单击StartSearch按钮运行主程序,直到文本框中显示输出。正如伪代码中指定的,此时,UI中的一条消息向用户显示程序启动。然后使用globalSetter方法,设置用户从UI填充的所有全局参数。有了这些参数,MainProgram开始运行。这是一个繁重的方法,需要几分钟才能运行。当MainProgram运行时,它通过在文本框中向用户显示消息来处理UI


所以,问题是在应用程序运行时,如何使用TAB来防止挂起UI?感谢您的回答。

您可以在MSDN上找到有关基于任务的异步模式的更多信息。我建议阅读整个页面,任务有时会带来讨厌的bug或其他问题。在使用之前,你应该完全理解它

您可以使用以下命令在新任务中执行代码:

Task.Factory.StartNew(() => {
    Console.WriteLine("Hello Task");
});

我尝试了您的解决方案,但收到错误:System.InvalidOperationException:“跨线程操作无效:从创建它的线程以外的线程访问控件“comboBoxLanguage”。@vasily.sib运行globalSetter方法时会发生此错误。@vasily.sib您可以看到伪代码。请描述我如何使用TAP在另一个线程中运行代码?如果我的实现错误,请告诉我如何修复它?tnxIt由你决定。我想版主总有一天会发现这个问题,并将其标记为删除。或者一些新的SO用户会为您编写一些代码以获得一些代表:\