c# - 时间:2019-01-02 标签:c#singleworkerthread,singleGUIthread
问题描述
我有几个表单应用程序,它们依赖工作线程来完成所有处理。他们与在某些情况下依赖于模拟用户界面(复制/粘贴功能)的外部应用程序对话。
在每种情况下,我在表单中都有一个 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 这样的东西,但是,这显然是不对的......
解决方案
推荐阅读
- c# - 使用 API 的 Xamarin 表单有时会返回不完整的 JSON
- kotlin - Kotlin 简单泛型函数编译错误 (*)
- html - 如何在表单中对齐 HTML
- apache-flink - 如果我们将一个返回布尔值的函数传递到 Flink CEP 的 where 子句中,它会以分布式方式工作吗?
- java - 登录在带有 Thymeleaf 的 Spring MVC 中不起作用
- python - Kivy 自我管理器得到屏幕 - 不工作
- python - Plotly 库未在 3D 散点图中显示标记
- oauth-2.0 - 如何从身份提供者(例如 Google)获取访问令牌的公钥
- php - Laravel Blade:如果 php 代码用 display none 包裹,它还能运行吗?
- ansible - Ansible nxos_interface 模块: