1

UI スレッドをブロックせずに Silverlight で印刷することは可能ですか?

大量のページを印刷する必要があるため、UI がしばらくフリーズします。代わりにバックグラウンド スレッドで印刷したい(可能であればプログレス バーを更新したい) のですが、方法がわかりません。

aのメソッド内Print()で myのメソッドを呼び出してみましたが、.PrintDocumentDoWork()BackgroundWorkerUnauthorizedAccessException "Invalid cross-thread access"

UI スレッドの外では PrintDocument を開始することすらできないよう です。同じ例外PrintDocument pd = new PrintDocument();BackgroundWorker.DoWork()スローされます。

印刷は UI スレッドで行う必要があると人々が言う投稿をたくさん見つけましたが、これに関するドキュメントはありません。私はマルチスレッドが初めてなので、正しい方向へのポインタをいただければ幸いです。

4

2 に答える 2

1

私はこの問題を抱えていて、残念ながら私が望んでいた答えがなかったこの質問に出くわしました。しかし、私は、この問題に遭遇した他の誰にとっても、これは少なくともいくらかの光を当てるかもしれないと思いました。

私はSilverlightでの印刷についてこの記事をフォローしていました。これは、UIスレッドでの通常の印刷の魅力のように機能しますが、実際に別のスレッドで印刷しようとすると、それは不可能だと思います。例のコードの最後の行を切り替えました

printDocument.Print("SLPrintDemo document");

それが機能するかどうかを確認するために別のもので

new Thread(() => printDocument.Print("SLPrintDemo document")).Start();

印刷ジョブ自体が別のスレッドで生成されるかどうかを確認します。ただし、コードはコンパイルされて正常に実行されますが、ドキュメントは印刷されません。その理由は、[印刷]コマンドが実行されると、プリンターやその他のオプションなどを選択するための印刷オプションダイアログが起動するためと思われます。この時点では、UIスレッド上にないため、何も起こりません(例外がないため、i ' mどこかに飲み込まれたと仮定して)

現時点で私が知る限り、UIスレッドにないSilverlightで印刷する方法はありません。

于 2012-07-26T16:25:24.253 に答える
0

UIを更新するには、ディスパッチャーを使用します。例えば:

Dispatcher.BeginInvoke(() =>
    {
        ProgressBar.Value = 100;
    });
于 2012-05-01T10:47:21.117 に答える