我有几个表单应用程序,它们依赖工作线程来执行所有处理。他们与外部应用程序对话,该应用程序在某些情况下依赖于模拟用户界面(复制/粘贴功能)。
在每种情况下,我都有一个RichTextBox表单,用于在进行过程中向用户提供反馈-需要异步,以便文本框可以实时更新。 (免责声明:这是我第一次深入研究线程和异步流程的世界,反馈部分至少可以正常工作!)
我有一个“ AppTrack”类,用于监视所有这些应用程序的使用情况,报告和更好的异常处理。在其中有2个函数(如下所示)中,我用来“安全”地启动工作线程,以及打开/关闭某些表单控件,以防止进一步的用户交互。
public static void DoInSafeThread(Action ActualThreadFunction, List<Control> FormControls = null)
{
System.Action<System.Exception> exception = null;
Thread thread = new Thread(
() => AppTrack.SafeExecute(() => ActualThreadFunction(), exception, FormControls)
);
thread.IsBackground = true;
thread.Start();
}
private static void SafeExecute(Action ActualThreadFunction, Action<Exception> handler, List<Control> FormControls)
{
try
{
DisableControls(FormControls);
ActualThreadFunction.Invoke();
EnableControls(FormControls);
}
catch (Exception ex)
{
Handler(ex);
}
}
如果要处理的事情列表(如下面的代码段),这给我带来了一个大问题。它将为每个线程激发一个新的工作线程,并且与外部应用程序的接口性质意味着进程会相互干扰并产生不良结果/错误。
foreach (IOccurrences s in sel)
{
AppTrack.DoInSafeThread(delegate()
{
CableChecking.CheckCables((IOccurrences)s, rtbLog, CableData, materials);
}, FormControls);
}
在我的“ AppTrack”类中使用了一个线程。在完成前一个操作时为其分配一个新操作,或者将它们排队等待依次运行,并最终向GUI线程反馈所有作业均已完成。但是,尝试实现我撞墙的危险...这甚至是正确的方法吗?
我原本希望找到诸如thread.BindNewAction之类的东西,但这显然是不对的...