0

我正在尝试创建一个线程类。该类只是创建一个新表单的线程以打开

class Threading
{
    private static int sendingForm;
    public void StartThread()
    {
        System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadProc));
        t.SetApartmentState(System.Threading.ApartmentState.STA);
        t.Start();
    }

    public static void ThreadProc()
    {
        switch (sendingForm)
        {
            case 1:
                System.Windows.Forms.Application.Run(new MainForm());
                break;
            case 2:
                System.Windows.Forms.Application.Run(new ReportPicker());
                break;
        }
    }
}

这个想法很简单,我只是在练习使用线程。我不想在每种形式中都这样做,所以我尝试通过在一个类中回收一些代码。正如你所看到的,我检测我想要去的表格的方式是根据我想要去的表格发送一个数字。基于该数字将是线程运行的形式。如果可能的话,我想改进它。我在想也许一种方法可以将我想去的表单作为参数发送,但由于每个表单都是它自己的类型,我找不到办法。事实上,我不知道是否可以这样做。所以,我在这里问你是否可以帮助我改进我的代码。是否按我要求的方法都没关系,只是尽可能多地回收代码。这是为了学习使用线程。感谢任何可以帮助我的人。

4

2 回答 2

0

使用线程时有一些黄金法则。

  1. 线程处理的数据应该作为参数给出。(sendingForm 是这里的问题。)
  2. UI 不应该是多线程的,使用 Invoke 或 BeginInvoke 来做 UI 的东西。
  3. 如果共享资源在线程使用时被修改,则锁定它们。
  4. 只有在 UI 中花费的时间太长或没有 UI 时才使用线程。

但我建议您查看 Task 和 BackgroundWorkerThread,而不是在前几次对自己进行一些线程化。

于 2012-12-06T20:05:02.507 回答
0

好的,你想去掉 ThreadProc 中的冗余和重复。那挺好的!这是一个可能的解决方案:

public static void ThreadProc<TForm>() where TForm : Form, new()
{
    System.Windows.Forms.Application.Run(new TForm());
}

new System.Threading.Thread(() => ThreadProc<MainForm>())

或者,基于反射:

public static void ThreadProc(Type formType)
{
    System.Windows.Forms.Application.Run((Form)Activator.CreateInstance(formType));
}

new System.Threading.Thread(() => ThreadProc(typeof(MainForm)))

或者,调用者注入:

public static void ThreadProc(Form form)
{
    System.Windows.Forms.Application.Run(form);
}

new System.Threading.Thread(() => ThreadProc(new MainForm()))

请注意,调用者必须在所有情况下更改以采用新的调用约定。

于 2012-12-06T20:21:31.300 回答