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
,但是您可以尝试 Invoke
或 BeginInvoke
喜欢以下内容
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 线程上执行代码,然后将调用传递给其 Send
或 Post
方法的委托地点。 (Post是Send的非阻塞。)
更详细的解释请访问This Link
如果 SynchronizationContext.Current
为空,则检查 this link 是否为空
我一直在开发一个 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
,但是您可以尝试 Invoke
或 BeginInvoke
喜欢以下内容
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 线程上执行代码,然后将调用传递给其 Send
或 Post
方法的委托地点。 (Post是Send的非阻塞。)
更详细的解释请访问This Link
如果 SynchronizationContext.Current
为空,则检查 this link 是否为空