C# 在线程期间保持UI响应。Sleep()
背景:我正在编写一个应用程序,它遍历服务器列表,并获得每台机器的各种详细信息。在迭代过程中,我需要更新表单上的各种控件(以显示所获得信息的摘要)。因为它在一个列表中迭代,所以我调用了Thread.Sleep()以允许用户在查询下一台机器之前有时间阅读信息。下面是我的代码:C# 在线程期间保持UI响应。Sleep(),c#,multithreading,task,C#,Multithreading,Task,背景:我正在编写一个应用程序,它遍历服务器列表,并获得每台机器的各种详细信息。在迭代过程中,我需要更新表单上的各种控件(以显示所获得信息的摘要)。因为它在一个列表中迭代,所以我调用了Thread.Sleep()以允许用户在查询下一台机器之前有时间阅读信息。下面是我的代码: Task TestTask = Task.Factory.StartNew(() => { foreach (String IpAddress in Servers
Task TestTask = Task.Factory.StartNew(() =>
{
foreach (String IpAddress in ServersToCheck)
{
if (IpAddress != String.Empty)
{
ServerBeingCheckedLabel.Text = IpAddress;
if (PingServer(IpAddress) == true)
{
PingChar_Label.ForeColor = Color.Green;
PingChar_Label.Text = "a";
CheckPermissionsAreValid(IpAddress);
}
else
{
PingChar_Label.ForeColor = Color.Red;
PingChar_Label.Text = "r";
PermChar_Label.ForeColor = Color.Red;
PermChar_Label.Text = "r";
}
}
}
Thread.Sleep(10000);
this.BackColor = FormBackGroundColor;
TestButton.Enabled = true;
RunTimer.Enabled = true;
}, CancellationToken.None, TaskCreationOptions.None, UiScheduler);
这在更新表单上的控件时效果很好,但在Thread.Sleep()期间,UI会锁定。当然,如果在一个单独的任务上调用了Thread.Sleep(),UI线程仍然未被阻止?使用
task.Delay
而不是Thread.Sleep
有关更多详细信息的签出链接应符合您的需要
改变
Task.Factory.StartNew(() =>
到
改变
Thread.Sleep
到
如果将
UiScheduler
作为TaskScheduler
传递,则该任务正在UI线程上运行。因此,是的,当您调用thread.Sleep
时,UI线程被完全阻塞
如果要延迟,请使用wait Task.delay(10000)
进行异步延迟
这将使从task.Factory.StartNew
atask
返回的任务成为一个task
任务,因为它与task.Run
不同,在构建时没有考虑异步等待。要修复此问题,请对返回的任务使用任务。展开:
Task<Task> TestTask = Task.Factory.StartNew(async () =>
{
// ...
await Task.Delay(10000);
// ...
}, CancellationToken.None, TaskCreationOptions.None, UiScheduler);
Task actualTask = TestTask.Unwrap();
Task TestTask=Task.Factory.StartNew(异步()=>
{
// ...
等待任务。延迟(10000);
// ...
},CancellationToken.None,TaskCreationOptions.None,UiScheduler);
Task actualTask=TestTask.Unwrap();
加载最后一个详细信息后,这似乎可以正常工作,但在运行之前的项目时似乎不会延迟。没关系,我将wait Task.delay()移动到了另一个位置,现在它似乎工作得很好。谢谢大家!@克里斯赖特,不客气。如果你的问题已经解决了,记得接受答案。我只是在等待时间的流逝。再次感谢:)非常感谢您的输入,不幸的是,我只能将一个响应标记为答案:(
await Task.Delay
Task<Task> TestTask = Task.Factory.StartNew(async () =>
{
// ...
await Task.Delay(10000);
// ...
}, CancellationToken.None, TaskCreationOptions.None, UiScheduler);
Task actualTask = TestTask.Unwrap();