首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不应该出现的跨线程操作异常

不应该出现的跨线程操作异常
EN

Stack Overflow用户
提问于 2014-07-05 07:06:12
回答 2查看 296关注 0票数 1

当我的方法被一个Cross-thread operation exception事件调用时,VS2013,WinForms,Debug模式上有一个奇怪的FileSystemWatcher。

例外情况出现在flowLayoutPanel.ResumeLayout();上。

守则是:

代码语言:javascript
复制
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 ...
    }
}

知道为什么会抛出异常,以及如何修复它吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-05 18:28:34

方法论证中发现了这个问题。StrategyIcon是一个具有自定义绘图的UserControl。

它在以下地方坠毁:

代码语言:javascript
复制
flowLayoutPanel.Invoke(new Action<StrategyIcon[]>(AddStrategyIcon),
    new object[] {icons});

通过将参数更改为DTO (数据传输对象)并将UserControls的实际创建移到视图中,解决了这个问题:

工作代码:

代码语言:javascript
复制
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();
    }
}
票数 0
EN

Stack Overflow用户

发布于 2014-07-05 18:24:34

如果flowLayoutPanel是在UI线程以外的线程上创建的,那么flowLayoutPanel.InvokeRequired将报告说,如果调用是在同一个非UI线程上调用的,则不需要调用。

但是,当您调用ResumeLayout()时,最终会调用包含控件上的函数,而该函数位于UI线程上,这将引发错误。

查找调用flowLayoutPanel = new FlowLayoutPanel()的位置,并查看是否在不是主UI线程的线程上调用它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24583935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档