2017-03-10 10 views
-1

私は小さなC#アプリケーションで作業しています。そのアプリケーションはメインスクリーン上にDataGridを1つ持ち、アプリケーションは1つの目的を持っています。ユーザーがF9を押すと、DataGrid項目をループし、その項目をメモ帳に書き込んで、そのメモ帳をFISCAL PRINTERに送信します(つまり、メモ帳ファイルをプリンタが聞いている場所に置きます)。 (* 会計プリンタの説明:ある場所、つまり(C:\ MyFiles)のメモ帳ファイルを待っている小さなプリンタで、正しいファイルを渡すと処理が進められます。プリンター、価格、品目のタイトルなどから出てくると、プリンターは彼が言っているところにすべて自分が書いたファイルを置くことになります。また、プリンターはFISCAL NUMBER ID *と呼ばれる特殊な番号を書きます。はC#コード!メソッドの実行方法と実行中のアプリケーションの実行(アプリケーションが終了するまでメソッドを待つ必要はありません)

は、だから私はすべてをした、すべてが正常に動作している、しかし、1つの問題がある:私はプリンタが待機しているフォルダ内の正しいファイルを残す場合は、プリンタがそれを取るだろう、と私のアプリケーションは、プリンタのために耳を傾けていきます

は、アプリケーションはそのプリンタファイルからそのFISCAL NUMBER IDを読み取る必要があるためです。

これは私の問題です。アプリケーションが応答するのを聞き、そのファイルを読み取ってそのデータベースにFISCAL NUMBER IDを入れて、3-4秒のような時間がかかるようにしなければなりません。それは私のアプリケーションやsmthのどこかをクリックすることは不可能です、それは単に凍結!

私の質問は、アプリケーションが依然としてユーザーのクリック/リクエストに反応している間に、スレッドや何かにこのメソッドを配置することができます。ここで

は私のコードは、ときに、ユーザーのプレスF9です:

if (e.Key == Key.F9) 
      { 
       try 
       { 

         if (dtgStavke.Items.Count > 0) 
         { 
          Printer printer = new Printer(); 
          printer.AdressAnswer = "C:\\MyPrinterFiles\\"; 
          printer.AdressError = "C:\\MyPrinterFiles\\Errors\\"; 
          printer.AdressExit = "C:\\MyPrinterFiles\\Good\\"; 


          Bill newBill = new Bill(); 

          newBill.OrdinalNumber = Convert.ToInt32(BillController.Instance.GetNextBillOrdinalNumber())+1; 
          newBill.Reversed = false; 
          newBill.Fiscalized = false; 
          newBill.BFF = 0; 
          newBill.BRR = 0; 

          newBill.TotalAmount = stavkeTemp.Sum(x => (x.Price*x.Quantity)); 
          newBill.TotalWithoutTax = totalWithoutTAXGlobal; 
          newBill.TotalTax = totalTaxGlobal; 

          if (_globalCustomer != null) 
          { 
           if (_globalCustomer.Status == 1) 
           { 
            newBill.CompanyId = _globalCustomer.Id; 
           } 
           else 
            newBill.PersonId = _globalCustomer.Id; 
          } 
          else 
          { 
           newBill.CompanyId = 1; 
           newBill.PersonId = 1; 
           newBill.UserId=1; 
          } 
          Bill lastInsertedBill = BillController.Instance.Save(newBill); 
          } 

          bool succeed = Print(lastInsertedBill, p, printer, _globalCustomer, false); 
         } 

        } 

       } 
       catch (Exception ex) 
       { 
        MessageBox.Show(ex.Message); 
       } 
      } 
     } 

私はそのような新しいスレッドか何かにこれを分離することができるか、私はいくつかのことをしようとしたが、それは間違いなく動作していませんか?

印刷方法と、すべてがそこに起こっているがあります:答えプリンタのファイルを読むため

を待っ

を作る

ファイルは再びそこからその年度のプリンタIDでデータベースを更新すると、ファイル

をプリンタ

その作業は必ず行わなければならないので、何らかの理由でそれを分離して、アプリケーションがユーザーの要求に応答するようにしておくと良いでしょう。Printメソッドが彼女の仕事をしています

bool succeed = Print(lastInsertedBill, p, printer, _globalCustomer, false); 

ありがとうございました 乾杯!

+4

あなたはC# – Sparrow

+0

のasync awaitについて読む必要があります@Sparrowはスレッディングのようなものです。今私はそれについて今読んでいます。 –

+0

非同期プログラミングはマルチスレッドとは異なりますが、あなたが望むことをするように設計されています。 – Sparrow

答えて

2

簡単な答えは、あなたが既に言及したスパローのような非同期待っているとすることができます。印刷する

コールは、その後、次のようになります。

bool succeed = await Task.Run(()=>Print(lastInsertedBill, p, printer, _globalCustomer, false)).ConfigureAwait(false); 

あなたの全体のコード構築物が中にも変更する必要がありますされているコードのメソッドシグネチャを。だからあなたの現在のシグネチャは次のようになります想像:

public void KeyPressed(Object o, KeyPressEventArgs e) 

それは次のように後で見るために変更する必要があります。

public async Task KeyPressed(Object o, KeyPressEventArgs e) 

これらの変更は、単に言われている別のタスク(であなたのPrintメソッドの実行になるだろう他のスレッドを利用するより効率的な方法)。このようにして、あなたのUIスレッドは、別のバックグラウンドスレッドがあなたの印刷ジョブを実行している間、自由に行うことができます。

非同期で読み上げたい場合は、このblog by Stpehen Clearyを開始点としてお勧めします。そして、私が非同期的に待っていた本はAlex Daviesの "Async in C#5.0"でした。それは108ページしかありません、本当に良く書かれており、あなたが必要とするすべての知識を得ることができます。

+0

私は明日これを試します、私は病気だったので、私はそれについて何もできませんでした、そして新しい仕事をするのはどうですか? Task.Factory.StartNew(()=> ...人々がそれをあまり使用しているのを見ましたか?それは非同期が待っているのと同じですか? –

+0

Task.Factory.StartNewは新しいタスクを開始する初期の唯一の方法でした。 net 4.5新しいタスクを開始する新しい方法はTask.Runです。単にTask.RunはTask.Factory.StartNewのオーバーロードで、新しいタスクを作成する最も一般的なケースを処理します。 /blogs.msdn.microsoft.com/pfxteam/2011/10/24/task-run-vs-task-factory-startnew/ –

+0

と、非同期で提供しているソリューションとの違いは何ですか? –

関連する問題