制作通用表单参数

时间:2012-12-06 19:37:16

标签: c# .net

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

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;
        }
    }
}

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

2 个答案:

答案 0 :(得分:0)

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

  1. 线程处理的数据应作为参数给出。 (sendForm是这里的问题。)
  2. UI永远不应该是多线程的,使用Invoke或BeginInvoke来做UI内容。
  3. 如果共享资源在线程使用时被修改,则将其锁定。
  4. 如果在UI中花费的时间过长或者没有UI,则仅使用线程。
  5. 但是我建议你看看Task和BackgroundWorkerThread,而不是在前几次做一些自我穿线。

答案 1 :(得分: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()))

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