Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在线程期间保持UI响应。Sleep()_C#_Multithreading_Task - Fatal编程技术网

C# 在线程期间保持UI响应。Sleep()

C# 在线程期间保持UI响应。Sleep(),c#,multithreading,task,C#,Multithreading,Task,背景:我正在编写一个应用程序,它遍历服务器列表,并获得每台机器的各种详细信息。在迭代过程中,我需要更新表单上的各种控件(以显示所获得信息的摘要)。因为它在一个列表中迭代,所以我调用了Thread.Sleep()以允许用户在查询下一台机器之前有时间阅读信息。下面是我的代码: Task TestTask = Task.Factory.StartNew(() => { foreach (String IpAddress in Servers

背景:我正在编写一个应用程序,它遍历服务器列表,并获得每台机器的各种详细信息。在迭代过程中,我需要更新表单上的各种控件(以显示所获得信息的摘要)。因为它在一个列表中迭代,所以我调用了Thread.Sleep()以允许用户在查询下一台机器之前有时间阅读信息。下面是我的代码:

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
a
task
返回的任务成为一个
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();