2012-04-12 59 views
0

我真的很绝望。我有WPF MVVM应用程序,并通过USB发送并接收一些数据包。我使用一个库,这个库需要HwndSource。一切工作正常,但现在我需要发送很多数据包,这需要一些时间,所以我决定使用BackgroundWorker并显示ProgressBar,但我不知道如何在BackgroundWorker中使用HwndSource,因为我得到这个错误:使用BackgroundWorker的HwndSource

The calling thread must be STA, because many UI components require this.

谁能帮助我解决这个问题?
谢谢。

回答

0

当使用单独的线程时,它们需要位于STA(单线程单元)中,而后台工作线程则不是这种情况。你可能会需要自己创建线程的陈述in this answer

Thread t = new Thread(ThreadProc); 
t.SetApartmentState(ApartmentState.STA); 
t.Start(); 

ThreadProcThreadStart类型的delegate

+0

谢谢你的快速回答。我已经找到您发布链接的文章。我只是想知道BackgroundWorker是否有一些解决方案。 – Artholl 2012-04-12 19:35:07

0

你可以通过从你的UI线程HwndSourceBackgroundWorker?如果是这样,它不会导致任何性能问题,那将是最简单的。如果这会导致性能问题,那么最好的办法可能是创建您自己的STA线程并在那里完成您的工作,而不是使用BackgroundWorker

+0

谢谢你的快速回答。我使用@Killercam建议。我搜索任何两天的解决方案,似乎让我自己的线程是如何管理这个最好的方法。 – Artholl 2012-04-12 19:39:15

0

听起来像它的工作除了当您尝试更新的进度控制。在BW的ProgressChanged事件中,如果您试图直接更新控件,则可能会遇到您遇到的错误。由于您使用MVVM,因此在ProgreeChanged事件中,如果您尚未执行此操作,则应更新绑定到进度控制的视图模型属性。

+0

感谢您的回答。问题在于HwndSource。当我打电话时,这是抛出错误。我读了一些关于它[这里](http://stackoverflow.com/a/1699709/1108200)。我只想知道,如果有更好的解决方案,而不是创建我自己的线程。 – Artholl 2012-04-12 19:45:14