每当我刷新进度条时我都有问题我得到错误调用线程无法访问此对象,因为另一个线程拥有它 我怎么能删除它 沙善
backgroundWorker12 = new BackgroundWorker();
timer1.Enabled = true;
//cancel any async processes running for the background worker
//backgroundWorker1.CancelAsync();
backgroundWorker12.DoWork += (s, args) =>
{
BackgroundWorker worker2 = s as BackgroundWorker;
worker2.WorkerReportsProgress = true;
float percentageDone = 20f;
//check if the user status and update the password in xml
CheckUseridPwd();
//call the function to sync the wall chart data
//call the function to sync event relate data
percentageDone = 100f;
ValidateLogin2(txtUserID.Text.Trim(), txtPassword.Password.Trim(), -1);
worker2.ReportProgress((int)percentageDone);
};`
答案 0 :(得分:5)
这个位看起来像是在错误的线程中使用UI控件:
ValidateLogin2(txtUserID.Text.Trim(), txtPassword.Password.Trim(), -1);
我建议您在添加事件处理程序的代码上方的本地字符串变量中捕获用户和密码 - 您可以在委托中使用这些捕获的变量。这样一切都应该在正确的线程上:
backgroundWorker12 = new BackgroundWorker();
timer1.Enabled = true;
string user = txtUserID.Text.Trim();
string password = txtPassword.Password.Trim();
backgroundWorker12.DoWork += (s, args) =>
{
// ... same code as before up to here
ValidateLogin2(user, password, -1);
worker2.ReportProgress((int)percentageDone);
};
答案 1 :(得分:0)
查看您是否可以使用RunWorkerCompleted event of the BackgroundWorker,,因为只有在进度为100%即完成后才访问用户界面。 然后你不必担心WPF UI控件的线程亲和性 - 因为在右边/ UI线程上再次调用事件处理程序。
另一个选项(如果您需要在工作完成之前访问UI控件)是缓存对象 在工作开始之前由UI线程上的Dispatcher.CurrentDispatcher返回,然后使用object.Invoke从正在执行DoWork处理程序的线程池线程编组到正确的线程。请参阅some code here。
答案 2 :(得分:0)
您是否尝试过调用ValidateLogin2
您可以直接从显示的代码中执行此操作,也可以在ValidateLogin2
中检查方法本身是否需要调用。如果没有,请继续并验证,但如果确实如此,则让它自己调用
void ValidateLogin2(...)
{
if (this.InvokeRequired)
{
//Invokes itself if required
BeginInvoke(new MethodInvoker(delegate(){ValidateLogin2(...);}));
}
else
{
//validate login here
}
}