C# 所需调用的替代方案

C# 所需调用的替代方案,c#,wpf,dispatcher,C#,Wpf,Dispatcher,我搜索并得到可以使用Dispatcher CheckAccess来代替wpf中所需的InvokereRequired 这是要在wpf中转换的代码 private void ChangeTextBox(string txt) { if (msg_log.InvokeRequired) { Invoke(new UpdateText(ChangeTextBox), new object[] { txt }); }

我搜索并得到可以使用Dispatcher CheckAccess来代替wpf中所需的InvokereRequired

这是要在wpf中转换的代码

  private void ChangeTextBox(string txt)
    {
        if (msg_log.InvokeRequired)
        {
            Invoke(new UpdateText(ChangeTextBox), new object[] { txt }); 
        }
        else
        {
            msg_log.Text += txt + "\r\n";
        }
    }
我试过这个-->

但在运行时,我收到错误[InvalidOperationException]“调用线程无法访问此对象,因为它属于另一个线程。”


我做错了什么?请提供帮助?

您的问题不是因为
检查访问
方法。。。可以使用它来检查是否需要调用
Invoke
。调用
调度程序
时,务必确保调用的是
调度程序
类的正确实例。从MSDN上的页面:

在WPF中,DispatcherObject只能由与其关联的Dispatcher访问。例如,后台线程无法更新与UI线程上的Dispatcher关联的按钮的内容。为了让后台线程访问按钮的内容属性,后台线程必须将工作委托给与UI线程关联的调度程序。这是通过使用Invoke或BeginInvoke来实现的。Invoke是同步的,BeginInvoke是异步的

因此,在您的情况下,如果您可以使用以下命令访问正确的
Dispatcher
实例:

msg_log.Dispatcher.CheckAccess()
然后,正如注释中提到的@SriramSakthivel,您应该在调用
Invoke
时访问相同的实例:

msg_log.Dispatcher.Invoke(new UpdateText(ChangeTextBox), new object[] { txt }); 

OP问题已解决,但仅作为记录,调度员检查的有用助手是:

public void DispatchIfNecessary(Action action) {
    if (!Dispatcher.CheckAccess())
        Dispatcher.Invoke(action);
    else
        action.Invoke();
}
可称之为:

DispatchIfNecessary(() => { myUIcontrol.Update(...); });

尝试
msg_log.Dispatcher.Invoke
@SriramSakthivel相同错误InvalidOperationException否您不应该得到异常。如果可能的话,发布当前更新的代码,重新生成void ChangeTextBox(string txt){If(msg_log.Dispatcher.CheckAccess()){msg_log.Dispatcher.Invoke(new UpdateText(ChangeTextBox),new object[]{txt};}否则{msg_log.Text+=txt+“\r\n”;}}是的,我正在做的是,但在msg\u log.Text+=txt+“\r\n”行出现InvalidOperationException错误,然后
msg\u log.Dispatcher
不是供您使用的正确的
Dispatcher
。我在使用单例模式的类中有一个
Dispatcher
属性(因此只有一个实例)在启动时,我从UI线程将其设置为
Dispatcher.CurrentDispatcher
。然后,每当我需要从UI线程访问
Dispatcher
时,我都可以使用该
Dispatcher
属性。这对我很有用,谢谢你的想法:)如果(!Dispatcher.CheckAccess()){Dispatcher.Invoke(()=>msg_log.Text+=txt+“\r\n”,DispatcherPriority.Normal);}其他{msg_log.Text+=txt+“\r\n”;}由于很难读取放在注释中的代码,这是习惯做法(但可选)供问题作者编辑问题并在此处提供解决方案代码摘要。我是stakoverflow的新手:)
DispatchIfNecessary(() => { myUIcontrol.Update(...); });