使用事件从另一个线程更新表单控件

时间:2014-03-17 06:41:16

标签: c# .net multithreading winforms

我是新手编码器,如果这听起来像个愚蠢的问题,请原谅。我已经检查了SO并搜索了如何更好地解释如何从另一个线程/类更新表单的控件(即listview,label)而不冻结表单并且不将表单暴露给其他类(也就是订阅事件)。我还没有发现任何可以解决我的问题或者已经彻底解释过的问题。

这是我到目前为止所拥有的内容,但在更新后,用户界面仍会冻结...

public partial class Main : Form
{
    private void Main_Load(object sender, EventArgs e)
    {
        UIEvents.CounterChanged += UpdateCounterLabel;
    }

    public void UpdateCounterLabel(string text)
    {
        lock (lblCounter)
        {
            try
            {
                if (lblCounter.InvokeRequired)
                    lblCounter.Invoke((MethodInvoker)(() => lblCounter.Text = string.Format("[{0}]", text)));
                else
                    lblCounter.Text = string.Format("[{0}]", text);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

从第二个线程调用DoWork():

public static class UIEvents
{
    public static event UpdateCounterHandler CounterChanged;
    public delegate void UpdateCounterHandler(string text);

    public static void UpdateCounter(string text)
    {
        if (CounterChanged != null)
            CounterChanged(text);
    }
}

public static class Worker
{
    public static void DoWork()
    {
        int result;
        ...
        ..
        .
        UIEvents.UpdateCounter(result.ToString());
    }
}

那我哪里错了?

1 个答案:

答案 0 :(得分:0)

结束每次UI更新之间的100ms超时,它解决了问题。