0

ドット ネット プロジェクトからの印刷をスレッドとしてのバックグラウンド作業として実行したいので、最初に各出力文字列を次のような文字列のコレクションに収集します。

 myOutputStringCollection.Add(str);

次に、プリンターに送信するすべての行を収集した後、スレッドを実行する次のようなコードを記述します。

public static void printAllLines()
{
    Thread t = new Thread(sendToPrinter);            
    t.Start(); //starts the thread
}

プリンター機能への送信は次のようになります。

 public static void sendToPrinter()
 {
     int count = myOutputStringCollection.Count;
     string[] myArray = new string[count];
     myOutputStringCollection.CopyTo(myArray, 0);
     for (int i = 0; i < count; i++)
     {
         SendStringToPrinter(myArray[i].ToString());
     }

     Array.Clear(myArray, 0, myArray.Length);
 }

ここで直面している問題は、印刷ボタンを複数回クリックするとすぐに印刷の位置合わせが正しくないことです。スレッドの実行を適切に処理すれば、問題ないと思います。

4

4 に答える 4

2

この問題の発生を防ぐには、スレッドを開始する直前に印刷ボタンを無効にし、文字列がプリンターに送信された後に再度有効にします。

public static void printAllLines()
{
    btnPrint.Enabled = false;      
    Thread t = new Thread(sendToPrinter);            
    t.Start();//starts the thread
}

public static void sendToPrinter()
{
    int count = myOutputStringCollection.Count;
    string[] myArray = new string[count];
    myOutputStringCollection.CopyTo(myArray, 0);
    for (int i = 0; i < count; i++)
    {
         SendStringToPrinter(myArray[i]); // no need for ToString() as it's already a string
    }

    // re-enable print button by marshalling to UI thread
    this.Invoke(new MethodInvoker(delegate() 
    { 
         btnPrint.Enabled = true;
    }));     
}

myArray はローカル変数であるため、Array.Clear() の呼び出しは必要ありません。したがって、sendToPrinter メソッド (およびスレッド) が終了すると破棄されます。

于 2013-05-20T12:16:13.120 に答える
0

実行中のすべてのスレッドが作業を完了するのを待ってから、アレイを完全にクリアする必要はありませんが、アレイをクリアする必要があると思います。

別のポイントとして、配列が非常に長くなり、非常に多くのスレッドを作成することは間違いなく非効率的です。

後者の場合、スレッド プールについて考えることができます。

于 2013-05-20T12:18:26.247 に答える