我是新手编码器,如果这听起来像个愚蠢的问题,请原谅。我已经检查了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());
}
}
那我哪里错了?
答案 0 :(得分:0)
结束每次UI更新之间的100ms超时,它解决了问题。