无限while循环形式应用程序C#
当表单应用程序启动时,我需要运行一个无限while循环。表单的开头是这样的:无限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
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;
});