虽然Haris的解决方案是可以接受的“固定装置”,但“你”与你的固定方法有重大设计缺陷;BackgroundWorker
。 类别,即:Component
, 执行<>/code><<>/code><<<>/code><<>>>>>>,因此应在生命结束时处理。
改变您的格局的最佳办法是以人工方式在另一个方面援引你的工作职能。 与此相关的唯一一条是:must <>/strong>打Displer.Invoke
,以便在你更新进展时与任何方面互动。 这里是你如何做的样本。
using System.Threading;
public static void RunInThread<TProgress>(
Action<Action<TProgress>> worker,
Action<TProgress> updateProgress,
Action workerCompleted)
{
Thread workerThread = new Thread(() =>
{
worker(updateProgress);
workerCompleted();
});
workerThread.Start();
}
由于这是一种通用的方法,你可以使用这种方法报告你喜欢的任何类型的进展。 下面是你可以称之为:
RunInThread<double>(
updateProgress =>
{
Thread.Sleep(500);
updateProgress(0.5);
Thread.Sleep(500);
updateProgress(1);
},
progress =>
{
this.Dispatcher.Invoke(() =>
{
progressLabel.Text = progress.ToString();
});
},
() =>
{
this.Dispatcher.Invoke(() =>
{
progressLabel.Text = "Finished!";
});
}
);
你们也可以非常容易地定制这一方法,以便在使用单一参数或回报值时,制造超负荷,增加方便。
public static void RunInThread<TProgress, TParameter>(
Action<Action<TProgress>, TParameter> worker,
Action<TProgress> updateProgress,
Action workerCompleted,
TParameter parameter)
{
Thread workerThread = new Thread(() =>
{
worker(updateProgress, parameter);
workerCompleted();
});
workerThread.Start();
}
public static void RunInThread<TProgress, TResult>(
Func<Action<TProgress>, TResult> worker,
Action<TProgress> updateProgress,
Action<TResult> workerCompleted)
{
Thread workerThread = new Thread(() =>
{
TResult result = worker(updateProgress);
workerCompleted(result);
});
workerThread.Start();
}
public static void RunInThread<TProgress, TParameter, TResult>(
Func<Action<TProgress>, TParameter, TResult> worker,
Action<TProgress> updateProgress,
Action<TResult> workerCompleted,
TParameter parameter)
{
Thread workerThread = new Thread(() =>
{
TResult result = worker(updateProgress, parameter);
workerCompleted(result);
});
workerThread.Start();
}
我也建议,如果在你的工作职能范围内出现任何打击,你会增加一些处理错误的代码,但我将这样做留给你。