C# 异常修复中的 Awesomium?

Awesomium in C# Exception Fix?

我一直在开发一个 C# WinForm 项目,其中有一个部分,当用户按下 "enter" 按钮时,一个 BackgroundWorker将在 Awesomium 实例 的源 属性 中设置一个新的 URI。但是,我遇到了 AweInvalidOperationException ("The calling thread cannot access this object because a different thread owns it.").

这是我工作的一部分的示例代码:

private void txt_To_KeyUp(object sender, KeyEventArgs e)
{
   if (e.KeyCode == Keys.Enter)
   {
   backgroundWorker.RunWorkerAsync();
   }
}

private void backgroundWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
  //Get values from an XML file and everything (Not included here anymore for it's too long)
  awesomiumInstance.Source = new Uri("http://maps.google.com?saddr=" +
                             txt_From.Text.Replace(" ", "+") + "&daddr=" +                                  txt_To.Text.Replace(" ", "+") + flag +
                             "&view=map&hl=en&doflg=ptk");
}


AweInvalidOperationException 发生在 第 12 行

awesomiumInstance.Source = new Uri("http://maps.google.com?saddr=" +
                           txt_From.Text.Replace(" ", "+") + "&daddr=" +
                           txt_To.Text.Replace(" ", "+") + flag +
                           "&view=map&hl=en&doflg=ptk");


这是异常的屏幕截图:

此异常的 fix/solution 可能是什么?

您需要调用 UI 线程上的代码,因为您没有使用 WPF,所以您没有 Dispatcher,但是您可以尝试 InvokeBeginInvoke 喜欢以下内容

        this.BeginInvoke((Action)(() =>
        {
            awesomiumInstance.Source = new Uri("http://maps.google.com?saddr=" +
                            txt_From.Text.Replace(" ", "+") + "&daddr=" +
                            txt_To.Text.Replace(" ", "+") + flag +
                            "&view=map&hl=en&doflg=ptk");
        }));

Invoke 导致操作在创建控件的 window 句柄的线程上执行。 BeginInvoke 是 Invoke 的异步版本,这意味着线程不会像阻塞的同步调用那样阻塞调用者。

如果这不起作用,您可以使用 SynchronizationContext

编辑:Post 是异步的

        SynchronizationContext.Current.Post(_ =>
        {
            awesomiumInstance.Source = new Uri("http://maps.google.com?saddr=" +
                            txt_From.Text.Replace(" ", "+") + "&daddr=" +
                            txt_To.Text.Replace(" ", "+") + flag +
                            "&view=map&hl=en&doflg=ptk");
        }, null);

SynchronizationContext 帮助您在必要时在 UI 线程上执行代码,然后将调用传递给其 SendPost 方法的委托地点。 (Post是Send的非阻塞。) 更详细的解释请访问This Link

如果 SynchronizationContext.Current 为空,则检查 this link 是否为空