无限while循环形式应用程序C#

无限while循环形式应用程序C#,c#,multithreading,forms,window,C#,Multithreading,Forms,Window,当表单应用程序启动时,我需要运行一个无限while循环。表单的开头是这样的: public Form1() { InitializeComponent(); } new Thread(() => { while (true) { Thread.Sleep(1000); //other tasks } }).Start(); 现在我想运行另一个函数,该函数将有一个无限循环,其中有一秒钟的睡眠时间: public

当表单应用程序启动时,我需要运行一个无限while循环。表单的开头是这样的:

public Form1()
{
        InitializeComponent();
}
new Thread(() => 
{
    while (true)
    {
        Thread.Sleep(1000);

        //other tasks
    }
}).Start();
现在我想运行另一个函数,该函数将有一个无限循环,其中有一秒钟的睡眠时间:

public void doProcess(){

    while(true){
         Thread.Sleep(1000);
         // other task
    }
}

我该怎么做?当我在构造函数中调用
doProcess()
时,它不会显示表单。我试着运行while循环10次。表单仅在所有迭代完成后显示。我不明白为什么会发生这种情况。

之所以会发生这种情况,是因为ctor从未退出,因此表单无法显示-这不是很明显吗

如果你想运行一个永久/睡眠循环线,你必须把它穿好

不要在GUI事件处理程序(或CTOR)中等待


您不能使用forms.timer吗?

之所以发生这种情况,是因为ctor从未退出,因此无法显示表单-这不是很明显吗

如果你想运行一个永久/睡眠循环线,你必须把它穿好

不要在GUI事件处理程序(或CTOR)中等待


你不能使用forms.timer吗?

简而言之,你正在用这个无限循环阻塞UI线程

运行它:

公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
开始工作();
}
私有异步void BeginWork()
{
while(true)
{
//由于我们异步等待,UI线程不会被文件下载阻塞。
var结果=等待工作(formTextField.Text);
//因为我们在UI上下文上继续,所以我们可以直接访问UI元素。
formTextField.Text=结果;
}
}
专用异步任务工作(对象文本)
{
//实际工作
等待任务。延迟(1000);
//返回实际结果
return DateTime.Now.Ticks.ToString();
}
}
对于更新循环来说,一段时间(true)可能有点过度。我建议您潜在地使用计时器和/或利用取消令牌来急切地取消请求,因为在高性能场景中,这些请求花费的时间太长,无法使用可能过时的结果更新UI

例如

公共部分类表单1:表单
{
专用只读定时器_sampleTimer;
公共表格1()
{
初始化组件();
_sampleTimer=新计时器
{
间隔=500//0.5秒
};
_sampleTimer.Tick+=DoWorkAndUpdateUIAsync;
}
专用异步void DoWorkAndUpdateUIAsync(对象发送方,事件参数e)
{
//由于我们异步等待,UI线程不会被“工作”阻塞。
var result=await-doworksync();
//因为我们在UI上下文上继续,所以我们可以直接访问UI元素。
resultTextField.Text=结果;
}
专用异步任务DoWorkAsync()
{
等待任务。延迟(1000);//进行实际工作采样usb异步(不阻塞ui)
return DateTime.Now.Ticks.ToString();//示例结果
}
私有无效开始按钮单击(对象发送者,事件参数e)
{
_sampleTimer.Start();
}
私有无效停止按钮\u单击(对象发送者,事件参数e)
{
_sampleTimer.Stop();
}
}

简而言之,您正在用这个无限循环阻塞UI线程

运行它:

公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
开始工作();
}
私有异步void BeginWork()
{
while(true)
{
//由于我们异步等待,UI线程不会被文件下载阻塞。
var结果=等待工作(formTextField.Text);
//因为我们在UI上下文上继续,所以我们可以直接访问UI元素。
formTextField.Text=结果;
}
}
专用异步任务工作(对象文本)
{
//实际工作
等待任务。延迟(1000);
//返回实际结果
return DateTime.Now.Ticks.ToString();
}
}
对于更新循环来说,一段时间(true)可能有点过度。我建议您潜在地使用计时器和/或利用取消令牌来急切地取消请求,因为在高性能场景中,这些请求花费的时间太长,无法使用可能过时的结果更新UI

例如

公共部分类表单1:表单
{
专用只读定时器_sampleTimer;
公共表格1()
{
初始化组件();
_sampleTimer=新计时器
{
间隔=500//0.5秒
};
_sampleTimer.Tick+=DoWorkAndUpdateUIAsync;
}
专用异步void DoWorkAndUpdateUIAsync(对象发送方,事件参数e)
{
//由于我们异步等待,UI线程不会被“工作”阻塞。
var result=await-doworksync();
//因为我们在UI上下文上继续,所以我们可以直接访问UI元素。
resultTextField.Text=结果;
}
专用异步任务DoWorkAsync()
{
等待任务。延迟(1000);//进行实际工作采样usb异步(不阻塞ui)
return DateTime.Now.Ticks.ToString();//示例结果
}
私有无效开始按钮单击(对象发送者,事件参数e)
{
_sampleTimer.Start();
}
私有无效停止按钮\u单击(对象发送者,事件参数e)
{
_sampleTimer.Stop();
}
}

您正在阻止UI线程。因此,只要运行
doProcess
,就无法处理UI

如果使用.Net 4.5,则可以使用异步等待:

public async void doProcess(){
    while(true){
         await Task.Delay(1000);
         // other task
    }
}

更干净的解决方案是使用每1秒触发一次事件的计时器。您可以在10次循环后关闭计时器。

您正在阻止UI线程。因此,只要运行
doProcess
,就无法处理UI

如果使用.Net 4.5,则可以使用异步等待:

public async void doProcess(){
    while(true){
         await Task.Delay(1000);
         // other task
    }
}

更干净的解决方案是使用每1秒触发一次事件的计时器。您可以在10次循环后关闭计时器。

您没有退出构造函数,因此窗体将无法运行
new Thread(() => 
{
    while (true)
    {
        Thread.Sleep(1000);

        //other tasks
    }
}).Start();
 w.Invoke((MethodInvoker) delegate
 {
     w.Width += 100;
 });