ユーザーがタスク、重いタスクを開始できるアプリケーションがあります。そして、これらのタスクの進行を 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));
}
}
}