C#Winforms:一个可以控制UI并且可以"休眠"而不会暂停整个程序的线程.怎么样?

Ale*_*rov 3 c# multithreading winforms

好...

在同一个程序中看起来像WinForms和Threading是我无法轻易掌握的东西.

我正在尝试从两个图片框(使用按钮)和文本框中制作自定义数字向上.是的,我可以使用默认的NumericUpDown表单,但我想做一个不同的表单.

我试图用计时器(System.Windows.Forms.Timer)来做到这一点.问题是当一个计时器遇到"Thread.Sleep(int)"时,整个程序"陷入睡眠".

我试过线程.某些类型的线程无法控制UI.然后我尝试了这个

private void declare_thread()
{
    //some work
    Thread delay = new Thread(new ThreadStart(delay0));
    delay.Start();
    //some more work
}
//other functions
private void delay0()
{
    //delay_for_500ms.WaitOne();
    this.Invoke((ThreadStart)delegate()
    {
    Thread.Sleep(500);
    if (is_mouse_down)
    timer1.Enabled = true;
    });
}
Run Code Online (Sandbox Code Playgroud)

结果与我仅使用计时器的结果相同.

所以,我想制作自定义数字向上.但我无法做到对.我知道我做错了.我想创建一个可以控制UI的线程,并且在调用"Thread.Sleep(int)"时不会使整个程序暂停.

请给我初学者的答案.到目前为止,我还没有找到一个可以向我展示正确方法的好答案,而且很容易理解.

Jon*_*eet 8

你正在寻找问题的错误答案.没有一个线程可以访问UI控件睡眠而不会阻止UI.只有UI线程可以安全地访问UI控件,如果您使UI线程处于休眠状态,您的UI将无法响应.

我担心你需要咬紧牙关并学习如何正确执行线程.请注意,睡眠几乎总是错误的方法 - 尤其是在UI线程中.你还没有真正说出你想要做的事情,但计时器是一种很好的方式,"我想在以后的某个时间点执行一些动作." .NET中各种不同的计时器 - 你应该使用哪一个取决于你想要做什么.

线程是你不能真正快捷的主题之一 - 你应该考虑阅读一本详尽的教程或一本详细介绍它的书.