【发布时间】:2019-05-29 08:34:53
【问题描述】:
我有一个控制台应用程序,在某些情况下需要显示用户界面。此用户界面需要保持响应,因为它将包含加载 gif、进度条、取消按钮等。我有以下示例代码:
class Program
{
static void Main(string[] args)
{
DoWork().GetAwaiter().GetResult();
}
private static async Task DoWork()
{
TestForm form = new TestForm();
form.Show();
string s = await Task.Run(() =>
{
System.Threading.Thread.Sleep(5000);
return "Plop";
});
if (s == "Plop")
{
form.Close();
}
}
}
我希望从上面的代码中 TestForm 在关闭之前显示大约 5 秒,因为字符串的值为“Plop”,但是所发生的只是任务运行并且 if 语句永远不会到达。此外,TestForm 的 UI 不会保持响应。这段代码有什么问题?
【问题讨论】:
-
这是 WinForms 还是控制台应用程序?似乎您需要在某处启动事件泵,例如
Application.Run(form). -
据我所知,不能保证任务会在与 UI 线程分开的线程上运行,并且您永远不应该在任务中使用 Thread.Sleep,因为它是阻塞操作; stackoverflow.com/q/28314695
-
@JohnWu 这是一个控制台应用程序
-
@AlphaDelta 当我用 for int 循环替换 Thread.Sleep 时,我看到了相同的结果
-
那么你有一个控制台应用程序,它向用户呈现表单?
标签: c# multithreading task