当我的方法被一个Cross-thread operation exception事件调用时,VS2013,WinForms,Debug模式上有一个奇怪的FileSystemWatcher。
例外情况出现在flowLayoutPanel.ResumeLayout();上。
守则是:
public void AddStrategyIcon(StrategyIcon[] icons)
{
if (flowLayoutPanel.InvokeRequired)
flowLayoutPanel.Invoke(new Action<StrategyIcon[]>(AddStrategyIcon),
new object[] {icons});
else
{
flowLayoutPanel.SuspendLayout();
flowLayoutPanel.Controls.AddRange(icons);
flowLayoutPanel.ResumeLayout(); // <- Cross-thread op. not valid ...
}
}知道为什么会抛出异常,以及如何修复它吗?
发布于 2014-07-05 18:28:34
方法论证中发现了这个问题。StrategyIcon是一个具有自定义绘图的UserControl。
它在以下地方坠毁:
flowLayoutPanel.Invoke(new Action<StrategyIcon[]>(AddStrategyIcon),
new object[] {icons});通过将参数更改为DTO (数据传输对象)并将UserControls的实际创建移到视图中,解决了这个问题:
工作代码:
public void AddStrategyIcon(StrategyIconDto[] dtoList)
{
if (flowLayoutPanel.InvokeRequired)
flowLayoutPanel.Invoke(new Action<StrategyIconDto[]>(AddStrategyIcon),
new object[] {dtoList});
else
{
var controls = new List<Control>();
foreach (StrategyIconDto dto in dtoList)
controls.Add((Control) new StrategyIcon(dto));
flowLayoutPanel.SuspendLayout();
flowLayoutPanel.Controls.AddRange(controls.ToArray());
flowLayoutPanel.ResumeLayout();
}
}发布于 2014-07-05 18:24:34
如果flowLayoutPanel是在UI线程以外的线程上创建的,那么flowLayoutPanel.InvokeRequired将报告说,如果调用是在同一个非UI线程上调用的,则不需要调用。
但是,当您调用ResumeLayout()时,最终会调用包含控件上的函数,而该函数位于UI线程上,这将引发错误。
查找调用flowLayoutPanel = new FlowLayoutPanel()的位置,并查看是否在不是主UI线程的线程上调用它。
https://stackoverflow.com/questions/24583935
复制相似问题