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

わかりました、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 に答える
0

スレッドを使用する際には、いくつかの黄金律があります。

  1. スレッドによって処理されるデータは、パラメーターとして指定する必要があります。(sendingForm が問題です。)
  2. UI は決してマルチスレッド化されるべきではありません。Invoke または BeginInvoke を使用して UI の処理を​​行います。
  3. スレッドによって使用されている間に共有リソースが変更された場合は、共有リソースをロックします。
  4. UI で時間がかかりすぎる場合、または UI がない場合にのみ、スレッドを使用してください。

ただし、最初の数回は自分でスレッド化するのではなく、Task と BackgroundWorkerThread を確認することをお勧めします。

于 2012-12-06T20:05:02.507 に答える