私は小さな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);
ありがとうございました 乾杯!
あなたはC# – Sparrow
のasync awaitについて読む必要があります@Sparrowはスレッディングのようなものです。今私はそれについて今読んでいます。 –
非同期プログラミングはマルチスレッドとは異なりますが、あなたが望むことをするように設計されています。 – Sparrow