带有Form应用程序C#的无限while循环

时间:2013-06-17 08:00:02

标签: c# multithreading forms window

我需要在表单应用程序启动时运行无限循环。表单就像这样开始

public Form1()
{
        InitializeComponent();
}

现在我想运行另一个函数,里面有一个无限循环,有一秒钟的休眠时间。

public void doProcess(){

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

我该怎么做?当我在构造函数中调用doProcess()时,它不显示表单。我尝试运行while循环10次迭代。表格仅在所有迭代后出现。我不明白为什么会这样。

6 个答案:

答案 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事件并将代码粘贴到那里