0

我有一个应用程序,用户可以启动任务,繁重的任务。我想在一个用户界面网格中管理这些任务的进度(每一行都是一个任务,带有一个进度条)用户可以通过单击一个按钮(使用主线程)来显示这个网格。我遇到的问题是Cross Thread Operation。我知道原因:每当任务进度发生变化(使用 thread1)时,算法都会尝试更新网格数据源(使用主线程)。但我不知道如何解决它。

我的网格的 DataSource 属性设置为BindingList<BackgroundOperation>.

我的任务的定义(BackgroundOperation)

public class BackgroundOperation
{
    public int progression;
    public int Progression
    {
        get { return progression;}
        set
        {
            progression = value;
            OnPropertyChanged("Progression");
        }
    }

    public event EventHandler OnRun;
    public event EventHandler<ProgressChangedEventArgs> OnProgressChanged;
    public event PropertyChangedEventHandler PropertyChanged;

    public void Run()
    {
        var task = new Task(() =>
        {
            if (OnRun != null)
                OnRun(this, null);
        });

    task.Start();
    }

    public void ReportProgress(int progression)
    {
        Progression = progression;

        if (OnProgressChanged != null)
            OnProgressChanged(this, new ProgressChangedEventArgs { Progression = progression });
    }


    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
}
4

1 回答 1

2

您需要在 UI 线程上运行OnProgressChanged(顺便说一句应该称为 just )。ProgressChanged您可以通过在创建类时保存当前SynchronizationContext值然后Post()在其中 ing 委托来做到这一点:

public class BackgroundOperation
{
    private readonly SynchronizationContext m_synchronizationContext;

    public BackgroundOperation()
    {
        m_synchronizationContext = SynchronizationContext.Current;
    }

    …

    public void ReportProgress(int progression)
    {
        Progression = progression;

        var handler = OnProgressChanged;
        if (handler != null)
            m_synchronizationContext.Post(
                _ => handler(
                    this,
                    new ProgressChangedEventArgs { Progression = progression }),
                null);
    }
}
于 2013-05-15T09:55:18.570 回答