我有一个 WPF 应用程序,在主窗体中,允许用户选择几个文件(Excel),然后单击一个按钮进行数据提取并将它们上传到数据库。一切正常。
现在我想实现一个繁忙的指标。
所以我所做的是,声明一个 BackgroundWorker 线程并将我的数据库上传(这需要时间)作为后台线程。当线程启动和完成时,相应地设置繁忙指示器。问题在我的上传过程中,我访问剪贴板以打印一些消息。所以我遇到了以下明显的错误。
"Current thread must be set to single thread apartment (STA) mode before OLE calls can be made."
BackgroundWorker 默认为 MTA。那么克服这个问题的最佳方法是什么?
代码:
Public WithEvents BgWorker As BackgroundWorker = New BackgroundWorker()
Private Sub MainWindow_Loaded() Handles Me.Loaded
AddHandler BgWorker.DoWork, AddressOf ExtractData
AddHandler BgWorker.RunWorkerCompleted, AddressOf BgWorker_RunWorkerCompleted
End Sub
Private Sub btnExtract_Click(sender As Object, e As RoutedEventArgs)
.....
Try
.....
Me.busyIndicator.IsBusy = True
BgWorker.RunWorkerAsync(Me.cmbFormats.SelectedItem.ToString.Trim())
Catch ex As Exception
Utility.Message.ErrorMessage(ex)
End Try
End Sub
完成事件:
Private Sub BgWorker_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
busyIndicator.IsBusy = False
End Sub
做工作:
Private Sub ExtractData(sender As Object, e As DoWorkEventArgs)
Dim exformat As IExtractor = New FormatFactory().CreateInstance(e.Argument.ToString())
If (exformat.FeedToDb(filename)) Then
Utility.Message.SuccessMessage("Successfully Extracted to database")
Else
End If
End Sub
Utility.Message.SuccessMessage :
Public Shared Sub SuccessMessage(msg As String)
Dim M As New Text.StringBuilder
M.AppendLine()
M.AppendLine(msg)
M.AppendLine()
Clipboard.Clear() 'problem with MTA
Clipboard.SetText(M.ToString)
MsgBox(M.ToString, MsgBoxStyle.Information, "FF IT")
End Sub
最佳答案
The thing is I have more of these calls inside other methods that are called from inside of FeedToDb
开始告诉你这是一个多么可怕的想法是相当困难的。试图专注于最严重的问题:
好吧,够了,您可能正在寻找快速修复。从 SuccessMessage() 方法中消除刺痛,知道它很尴尬并且在从工作线程中使用时无法正常工作:
Public Shared Sub SuccessMessage(msg As String)
If System.Threading.Thread.CurrentThread.GetApartmentState <> Threading.ApartmentState.STA Then Return
'' etc...
End Sub
关于.net - 如何在 BackgroundWorker 中访问 COM 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23531371/