显示来自不同线程的表单

时间:2016-01-12 18:31:22

标签: c# multithreading winforms backgroundworker

所以我有一个包含这个的静态类:

    public static void ShowErrorReport(Exception e, SqlCommand sqlc = null)
    {
        try
        {
            frmErrorReport frmER = new frmErrorReport(e, SqlCommand_: sqlc);
            frmER.ShowDialog();
            frmER.Dispose();
        }
        catch (Exception f)
        {
            Debug.Print(f.ToString());
        }
    }

我希望能够在排队的后台工作程序中运行的一些与数据库相关的方法中使用它。问题是这些方法有时不知道任何winforms对象,所以使用Invoke()是不可能的(据我所知)。

是否还有其他方法可以从后台工作线程中调用此过程并确保在UI线程上创建表单?

或者我会通过传递一个winforms对象来使这些数据库方法搞得一团糟(不要期待这种可能性!)?

我对多线程很陌生......

由于

1 个答案:

答案 0 :(得分:0)

  

我希望能够在排队后台工作程序中运行的一些与数据库相关的方法中使用它。问题是这些方法有时不知道任何winforms对象,所以使用Invoke()是不可能的(据我所知)。

如果你的后台代码需要与UI交互,你需要以某种方式传递它以正确地与UI交谈。通常要抽象出来,你可以创建一个“交互服务”,你可以传递给你的类,然后交互服务会调用你需要的任何UI技术。

f5

如果您决定从Winforms切换到WPF甚至切换到控制台,public BackgroundClass { public BackgroundClass(IInteractionService interactionService) { _interactionService = interactionService; } private readonly IInteractionService _interactionService; public static void ShowErrorReport(Exception e, SqlCommand sqlc = null) { try { _interactionService.ShowErrorReportDialog(e, sqlc); } catch (Exception f) { Debug.Print(f.ToString()); } } } public interface IInteractionService { void ShowErrorReportDialog(Exception e, SqlCommand cmd); } public class WinFormsInteractionService : IInteractionService { public WinFormsInteractionService() this(SynchronizationContext.Current) { } public WinFormsInteractionService(SynchronizationContext syncContext) { if(syncContext == null) throw new ArgumentNullException("syncContext"); _syncContext = syncContext; } private readonly SynchronizationContext _syncContext; public void ShowErrorReportDialog(Exception e, SqlCommand cmd) { _syncContext.Send(s => { using(frmErrorReport frmER = new frmErrorReport(e, SqlCommand_: cmd)) { frmER.ShowDialog(); } }); } } 不需要进行任何更改,您只需要为任何UI技术创建一个实现BackgroundClass的新类你正在使用。

IInteractionService