这是我在这个论坛的第一个问题,希望它不会在某个地方重复,因为我已经搜索了将近4周的响应而没有取得任何进展。
这是我的情况, 我正在开发一个需要进行大量后台操作的应用程序,因此我创建了2个BKW,第一个用于从数据库加载数据并将其放入可观察集合中,“无需报告进度或支持取消这一个':
private Boolean loadTestSteps()
{
// Create a background worker thread that don't report progress and does not
// support cancelation
BackgroundWorker wk_LoadTestSteps = new BackgroundWorker();
wk_LoadTestSteps.DoWork += new DoWorkEventHandler(wk_LoadTestSteps_DoWork);
wk_LoadTestSteps.RunWorkerAsync();
return true;
}
可观察的集合类:
public class clsTestStep:DependencyObject { public static DependencyProperty TestStepProperty = DependencyProperty.Register( “TestStep”,typeof(String),typeof(clsTestStep));
public string TestStep
{
get { return (string)GetValue(TestStepProperty); }
set { SetValue(TestStepProperty, value); }
} and so on for the rest of items....
现在主要的backGround应该执行更长的操作,同时向主UI报告进度,声明如此
private void InitializeBackGroundWork()
{
_wk_StartTest = new BackgroundWorker();
// Create a background worker thread that ReportsProgress &
// SupportsCancellation
// Hook up the appropriate events.
_wk_StartTest.DoWork += new DoWorkEventHandler(_wk_StartTest_DoWork);
_wk_StartTest.ProgressChanged += new ProgressChangedEventHandler
(_wk_StartTest_ProgressChanged);
_wk_StartTest.RunWorkerCompleted += new RunWorkerCompletedEventHandler
(_wk_StartTest_RunWorkerCompleted);
_wk_StartTest.WorkerReportsProgress = true;
_wk_StartTest.WorkerSupportsCancellation = true;
_wk_StartTest.RunWorkerAsync();
}
void _wk_StartTest_DoWork(object sender, DoWorkEventArgs e)
{
//Loop through each test step and perform Test
foreach (clsTestStep item in _testStep)
{
Thread.Sleep(200);
temp[0] = item.TestStep;
temp[1] = item.Delay.ToString();
temp[2] = item.NumberRepetition.ToString();
temp[3] = item.Mode.ToString();
//Report % of Progress, Test step Name,and the paragraph from Class PerformTest
_wk_StartTest.ReportProgress(counter,
temp[0]);
counter += 1;
_performTest.Fdispatcher(temp, out _paragraph);
//_si.PgBarMax = Convert.ToDouble(_testStep.Count);
}
//Report completion on operation completed
_wk_StartTest.ReportProgress(counter);
}
我在这里失踪了,因为我的脑袋会从搜索中消失!!!
答案 0 :(得分:0)
听起来你的ObservableCollection是由其他线程创建的,所以你的_ wk_StartTest_DoWork 方法无法访问它。
你的 _testStep 变量来自哪里?
顺便说一下,在多线程环境中,当许多线程访问相同的数据时,您应该更喜欢使用 ConcurrentBag 类而不是ObservableCollection。 ConcurrentBag是线程安全的。
答案 1 :(得分:0)
对于那些可能会遇到这种问题的人^^ finnaly我找到了一种方法来访问一个类,即使它不是由当前线程所拥有的一篇很好的文章,一步一步解释如何做到这一点here