我需要在表单应用程序启动时运行无限循环。表单就像这样开始
public Form1()
{
InitializeComponent();
}
现在我想运行另一个函数,里面有一个无限循环,有一秒钟的休眠时间。
public void doProcess(){
while(true){
Thread.Sleep(1000);
// other task
}
}
我该怎么做?当我在构造函数中调用doProcess()
时,它不显示表单。我尝试运行while循环10次迭代。表格仅在所有迭代后出现。我不明白为什么会这样。
答案 0 :(得分:4)
您可以开始这样的新主题:
new Thread(() =>
{
while (true)
{
Thread.Sleep(1000);
//other tasks
}
}).Start();
虽然我建议你在做之前阅读线程。如果要从其他线程更新表单,则应使用:Form.Invoke()
。
例如:w
是表格
w.Invoke((MethodInvoker) delegate
{
w.Width += 100;
});
答案 1 :(得分:3)
简而言之,您正在使用此无限循环阻止UI线程。
运行async:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
BeginWork();
}
private async void BeginWork()
{
while (true)
{
// Since we asynchronously wait, the UI thread is not blocked by the file download.
var result = await DoWork(formTextField.Text);
// Since we resume on the UI context, we can directly access UI elements.
formTextField.Text = result;
}
}
private async Task<string> DoWork(object text)
{
// Do actual work
await Task.Delay(1000);
// Return Actual Result
return DateTime.Now.Ticks.ToString();
}
}
对于更新循环,while(true)可能有点过量。我是否可以建议您使用Timer,和/或利用取消令牌来急切地取消已经花费很长时间的请求,这些请求在高性能方案中不会更新可能过时的UI。
E.g。
public partial class Form1 : Form
{
private readonly Timer _sampleTimer;
public Form1()
{
InitializeComponent();
_sampleTimer = new Timer
{
Interval = 500 // 0.5 Seconds
};
_sampleTimer.Tick += DoWorkAndUpdateUIAsync;
}
private async void DoWorkAndUpdateUIAsync(object sender, EventArgs e)
{
// Since we asynchronously wait, the UI thread is not blocked by "the work".
var result = await DoWorkAsync();
// Since we resume on the UI context, we can directly access UI elements.
resultTextField.Text = result;
}
private async Task<string> DoWorkAsync()
{
await Task.Delay(1000); // Do actual work sampling usb async (not blocking ui)
return DateTime.Now.Ticks.ToString(); // Sample Result
}
private void startButton_Click(object sender, EventArgs e)
{
_sampleTimer.Start();
}
private void stopButton_Click(object sender, EventArgs e)
{
_sampleTimer.Stop();
}
}
答案 2 :(得分:2)
这种情况正在发生,因为ctor永远不会退出,所以形式无法显示 - 这是不是很明显?
如果你想运行永久/睡眠循环线,你必须将其断开。
不要在GUI事件处理程序(或ctors)中等待。
你能不能使用forms.timer?
答案 3 :(得分:1)
您正在阻止UI线程。因此,只要doProcess
运行,就无法处理UI。
如果使用.Net 4.5,则可以使用异步等待:
public async void doProcess(){
while(true){
await Task.Delay(1000);
// other task
}
}
更清洁的解决方案是使用一个每1秒触发一次事件的计时器。您可以在10次循环后关闭计时器。
答案 4 :(得分:0)
您没有退出构造函数,因此表单不会显示。 如果您想在表单显示后将代码放在Form_Load事件中。 但您更愿意使用后台线程来完成它,以便您可以使用backgroundworker
答案 5 :(得分:0)
您可以将它放在Initialize组件之后,或者找到表单的load事件并将代码粘贴到那里