我正在绞尽脑汁地尝试让多线程在 WPF 中按照我想要的方式工作
我有一个名为 Manager 的对象(带有单例),它执行大量处理和查找。我希望它在与 UI 分开的线程中运行,UI 将调用 Manager 上的方法来执行 UI 应该做出反应的处理和触发事件
我正在从 Windows 窗体转换此应用程序,我认为这不是问题,因为文本框事件是在不同的线程中自动触发的。在 WPF 中则不然,一切似乎都停留在 UI 线程上。
如何使对象在不同的线程中“活动”,然后如何调用它的方法。我尝试在 Window 构造函数中使用它将其生成到一个新线程
Thread managerThread = new Thread(new ThreadStart(ManagerStartingPoint));
managerThread.SetApartmentState(ApartmentState.STA);
managerThread.IsBackground = true;
managerThread.Start();
and:
private void ManagerStartingPoint()
{
ManagerSingleton.Manager = new Manager();
MediatorSingleton.Mediator = new Mediator();
}
在文本框 textchanged 事件上,我调用 Manager.SetItemText(e.Value) ,逻辑上应该在新线程上调用它,对吧?当我键入并且事件触发 UI 时,仍然会“口吃”并且在文本框中键入内容会受到影响。我需要异步调用该方法还是其他什么?
您只是在后台创建这些对象;这并没有什么区别。您需要在后台调用您的方法:
public YourTextBox_TextChanged(...) {
var bw = new BackgroundWorker();
bw.DoWork += (sender, args) => {
// do your lengthy stuff here -- this will happen in a separate thread
Manager.SetItemText(e.Value)
}
bw.RunWorkerCompleted += (sender, args) => {
if (args.Error != null) // if an exception occurred during DoWork,
MessageBox.Show(args.Error.ToString()); // do your error handling here
// Do whatever you want to do after the SetItemText has completed.
// We are back in the UI thread here.
...
}
bw.RunWorkerAsync(); // start the background worker
}
PS: 确保您的Manager.SetItemText
方法是线程安全的!使用后台线程,很可能会出现多个实例Manager.SetItemText
并行运行(如果第二个 TextChanged 事件在第一个 SetItemText 完成之前到达)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)