c#委托抛出System.InvalidOperationException

时间:2019-05-31 08:30:41

标签: c# multithreading

我有一个线程可以从xml文件中检索信息。在我的主要形式中,我有一个复选框,如果xml中的布尔值为true,则必须由线程检查。我创建了一个Delegate,但是尽管如此,当线程尝试更改复选框的值时,仍引发System.InvalidOperationException。为什么?!?

private delegate void ProjectFileReloadDelegate(string pp);

private void ProjectFileReload(string projectPath)
{
    if (this.InvokeRequired)
    {
        this.Invoke(new ProjectFileReloadDelegate(ProjectFileReload), projectPath);
    }
    else
    {
        //This throws the exception
        //I retrive the anchorMode Info 
        anchorMode.Checked = ProjectOptions_v000.AnchorMode;
    }

1 个答案:

答案 0 :(得分:0)

我在后台使用了许多Task处理一些api调用,然后在更新GUI时必须使用带有调用的委托,我的参考来自Microsoft,标题为“指定同步上下文” TaskScheduler.FromCurrentSynchronizationContext()告诉它在gui线程上运行。

    private delegate void ProjectFileReloadDelegate(string pp);

    private void ProjectFileReload(string projectPath)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new ProjectFileReloadDelegate(ProjectFileReload), projectPath);
        }
        else
        {
            //This throws the exception
            //I retrive the anchorMode Info 

            Task.Factory.StartNew(
                       delegate {
                           anchorMode.Checked = ProjectOptions_v000.AnchorMode;
                       }, TaskScheduler.FromCurrentSynchronizationContext()
                   );