0

ユーザーがタスク、重いタスクを開始できるアプリケーションがあります。そして、これらのタスクの進行を 1 つのユーザー インターフェイス グリッドで管理したい (各行はタスクで、進行状況バーがあります) ユーザーはボタンをクリックして (メイン スレッドを使用して) このグリッドを表示できます。私が抱えている問題はクロススレッド操作です。理由はわかっています。タスクの進行状況が (スレッド 1 で) 変更されるたびに、アルゴリズムはグリッド データソースを (メイン スレッドで) 更新しようとします。しかし、私はそれを修正する方法がわかりません。

グリッドの 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