小编use*_*584的帖子

为什么在Task中运行的Thread.Sleep不会阻止WinForms UI线程?

我正在玩C#和Window Forms中的任务,我遇到了一个奇怪的效果.我有一个表格,其中包含一个每300毫秒勾选一次的计时器.tick事件将该表单中控件的背景更改为随机颜色.我有另一个按钮,点击它时会启动一个新的任务,它只是Thread.Sleep用来等待3秒钟.我还插入了一个用于记录的文本框.

因为从我对任务的理解,他们没有创建新线程来运行任务(并且日志也显示了这一点),我希望第一个按钮在任务运行时停止改变它的颜色3秒,因为一个线程一次只能做一件事.按钮闪烁或3秒钟无效.

然而,这个假设似乎是错误的,因为即使在假设线程正在睡觉时按钮也会愉快地改变它的颜色!怎么会这样?

跟进:我注意到,从tasks方法中,我必须使用Invoke访问日志记录文本框.但是,根据MSDN的Control.InvokeRequired文档:

如果控件的句柄是在与调用线程不同的线程上创建的,则为true (表示必须通过调用方法调用控件); 否则,错误.

既然这是单线程场景怎么可能InvokeRequired是真的呢?

PS:我知道这Task.Delay是件事.我想了解为什么UI线程在a期间不会阻塞Thread.Sleep.

日志输出 ::

[T9] Before await
[T9] [I] Task Start
[T9] [I] Task End
[T9] After await
Run Code Online (Sandbox Code Playgroud)

闪烁按钮还显示了tick事件处理程序执行的线程的线程ID,它也是9.

完整代码:

using System;
using System.Drawing;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AsyncAwaitTest
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }

    public class Form1 : Form
    {
        private …
Run Code Online (Sandbox Code Playgroud)

.net c# asynchronous task winforms

4
推荐指数
1
解决办法
811
查看次数

标签 统计

.net ×1

asynchronous ×1

c# ×1

task ×1

winforms ×1