我有一个包含多个窗口类并公开显示这些窗口的方法的WPF dll。
我还有一个单独的WinForms项目,该项目在BackgroundWorker组件的DoWork方法中调用WPF项目中的其中一种方法。
在实例化WPF Window的代码行上,我收到以下运行时错误:
“因为许多UI组件需要它,所以调用线程必须是STA。”
谷歌搜索引导我进入this discussion。 (原来Jon Skeet除了Stack Overflow之外还在其他网站回答问题!)他链接到this article,其中提到:
“BackgroundWorker组件与WPF很好地配合使用......”
该文章还提到使用DispatcherObject类,但我不知道如何使其工作,而且我更愿意继续使用我的BackgroundWorker组件。
作为一个测试案例,我想出了以下代码来重现错误。在WPF类库中,以下是Window1.xaml.vb的代码。
在WinForms应用程序中,这是Form1.vb中的代码。
即使将BackgroundWorker组件放置在Window1.xaml.vb中,仍会出现相同的错误。那么,那篇文章是错误的,我真的不能在WPF中使用BackgroundWorker吗?还是我需要做其他事情才能让它正常工作?
如果BackgroundWorker无法工作,那么我该如何替换Form1.vb中的代码以使用Dispatcher呢?
我还有一个单独的WinForms项目,该项目在BackgroundWorker组件的DoWork方法中调用WPF项目中的其中一种方法。
在实例化WPF Window的代码行上,我收到以下运行时错误:
“因为许多UI组件需要它,所以调用线程必须是STA。”
谷歌搜索引导我进入this discussion。 (原来Jon Skeet除了Stack Overflow之外还在其他网站回答问题!)他链接到this article,其中提到:
“BackgroundWorker组件与WPF很好地配合使用......”
该文章还提到使用DispatcherObject类,但我不知道如何使其工作,而且我更愿意继续使用我的BackgroundWorker组件。
作为一个测试案例,我想出了以下代码来重现错误。在WPF类库中,以下是Window1.xaml.vb的代码。
Partial Public Class Window1
Public Shared Function ShowMe() As Boolean?
Dim w = New Window1 'Error appears on this line.
Return w.ShowDialog()
End Function
End Class
在WinForms应用程序中,这是Form1.vb中的代码。
Imports System.ComponentModel
Public Class Form1
Private WithEvents worker As BackgroundWorker
Private Sub doWord(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles worker.DoWork
WpfLibrary.Window1.ShowMe()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
worker = New BackgroundWorker
worker.RunWorkerAsync()
End Sub
End Class
即使将BackgroundWorker组件放置在Window1.xaml.vb中,仍会出现相同的错误。那么,那篇文章是错误的,我真的不能在WPF中使用BackgroundWorker吗?还是我需要做其他事情才能让它正常工作?
如果BackgroundWorker无法工作,那么我该如何替换Form1.vb中的代码以使用Dispatcher呢?