我试图在我的 UI 的另一个线程上运行一个长时间运行的实例方法,但仍将进度报告回 GUI 线程以更新进度条。我知道有很多方法可以做到这一点,并且有很多关于这个的问题。我拥有的长时间运行的实例方法实际上有两个它自己的事件。它有一个在 PropertyChanged 上触发的事件,用于报告当前已完成的工作和当前需要完成的总工作。它还有一个 OperationCompleted 事件。我打算BackgroundWorker
在我的 UI 中使用 a 在单独的线程上运行这个长时间运行的方法。我想弄清楚的是:
如果我为 PropertyChanged 和 OperationCompleted 事件创建事件处理程序,我可以实现它们来引发BackgroundWorker
事件吗?这是否允许它们全部在后台线程上运行,并从本质上模拟一个事件冒泡到 UI 线程?下面是一个例子:
class GUI : Form
{
private BackgroundWorker back = new BackgroundWorker();
back.WorkerReportsProgress = true;
back.DoWork += new DoWorkEventHandler(myWork);
back.ProgressChanged += new ProgressChangedEventHandler(myWork_changed);
back.RunWorkerCompleted += RunWorkerCompletedEventHandler(myWork_completed);
/* GUI CODE OMITTED */
private void button_click(object sender, EventArgs e)
{
back.RunWorkerAsync();
}
private void myWork(object sender, DoWorkEventArgs e)
{
Syncer sync = new Syncer();
sync.PropertyChanged += new PropertyChangedEventHandler(sync_PropertyChanged);
sync.OperationCompleted += new EventHandler(sync_OperationCompleted);
sync.LongRunningMethod();
}
private void sync_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
//calculations & logic as needed
back.ReportProgress(calculated);
}
//might not be necessary to implement because of how BackgroundWorker functions
private void sync_OperationCompleted(object sender, EventArgs e)
{
back.ReportProgress(100);
}
private void myWork_changed(object sender, ProgressChangedEventArgs e)
{
//update UI progress bar
}
private void myWork_completed(object sender, RunWorkerCompletedEventArgs e)
{
//tasks needed @ completion such as hide progress bar
}
BackgroundWorker
那么 Syncer 类的事件会在与'DoWork()
方法相同的线程上触发吗?这个线程安全吗?欢迎批评和替代建议!