Yas*_*ser 22 .net c# wpf multithreading dispatcher
每当我刷新标签时,我都会收到此错误: 调用线程无法访问此对象,因为另一个线程拥有它.我试图调用,但它失败了.我正在使用WPF表格.
delegate void lostfocs(string st);
private void imgPayment_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Thread t = new Thread(modi);
t.Start();
}
void modi()
{
try
{
label1.Content = "df";
}
catch
{
lostfocs ld = new lostfocs(up);
// ld.Invoke("df");
object obj=new object();
ld.Invoke("sdaf");
}
}
void up(string st)
{
label1.Content = st;
}
Run Code Online (Sandbox Code Playgroud)
Hab*_*bib 40
使用Dispatcher.Invoke方法.
在与Dispatcher关联的线程上同步执行指定的委托.
也
在WPF中,只有创建DispatcherObject的线程才能访问该对象.例如,从主UI线程分离出来的后台线程无法更新在UI线程上创建的Button的内容.为了让后台线程访问Button的Content属性,后台线程必须将工作委托给与UI线程关联的Dispatcher.这是通过使用Invoke或BeginInvoke来完成的.Invoke是同步的,BeginInvoke是异步的.该操作将添加到指定DispatcherPriority的Dispatcher的事件队列中.
您收到错误是因为您的标签是在UI线程上创建的,并且您正在尝试通过另一个线程修改其内容.这是您需要Dispatcher.Invoke的地方.
看看这篇文章 WPF Threads使用Dispatcher构建更多响应式应用程序
gau*_*rma 17
您可以使用Dispatcher.你的代码变成......
private void imgPayment_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Dispatcher.BeginInvoke(DispatcherPriority.Input, new ThreadStart(() =>
{
try
{
label1.Content = "df";
}
catch
{
lostfocs ld = new lostfocs(up);
// ld.Invoke("df");
object obj=new object();
ld.Invoke("sdaf");
}
}
));
Run Code Online (Sandbox Code Playgroud)
Til*_*lak 11
例
void modi()
{
if(!Dispatcher.CheckAccess())
{
Dispatcher.Invoke(
()=>label1.Content = "df",DispatcherPriority.Normal);
}
else
{
label1.Content = "df";
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
50098 次 |
最近记录: |