首页 > 解决方案 > 时间: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#multithreadingvisual-studio-2010

解决方案


推荐阅读