3

Windows フォームでアプリケーションを作成しました。申請書を提出すると、申請書が処理されます。アプリケーションを処理し、提出されたアプリケーションを別のワークフローに移動するクラス ライブラリを作成しました。このために、送信ボタンのクリック イベントからクラス ライブラリを呼び出しました。すべて正常に動作していますが、唯一の問題は、アプリケーションを送信してクラス ライブラリを呼び出すと、処理に時間がかかることです。アプリケーションを閉じて、ライブラリ メソッドを非同期で呼び出す必要があります。以下はコードです:

private void OnPASubmit_Click(object sender, EventArgs e)
{
    if ((ApplAcct.AcctID == 0) || CheckForChanges())
    {
        UIHelper.ShowMessage("Please Save Application first");
        return;
    }
    try
    {
        if (!AOTHelper.ValidateCheckOut(ApplAcct.AcctID))
        {
            return;
        }
        WorkflowTask.PutAccountWorkflowTask(ApplAcct.AcctID, AOTHelper.FindAcctGUID(Main.objAccountGUID, Acct.AcctID), Environment.UserName, 2);
        AOTHelper.checkInAccount(ApplAcct.AcctID);
        AOTHelper.AccountToProcess(Acct.AcctID);
        UIHelper.ShowMessage("Application has been submitted for processing.");
        this.Close();
    }
    catch (Exception ex)
    {
         AOTHelper.WriteLog(ex, "Can not submit application for processing ");
    }

    // ...
}

AotHelper.AccountToProcess(Acct.AcctID) メソッドはクラス ライブラリを呼び出します。Asunchronous 呼び出しを使用してこれを実行し、アプリケーションが送信されたら処理を待つ必要がないようにしたいと考えています。

どうしよう。助けてください!

4

7 に答える 7

2

BackgroundWorker スレッドを使用できます...

BackgroundWorkerは、スレッドを で簡単に実装できるようにしWindows Formsます。集中的なタスクは別のスレッドで実行する必要があるため、UI doesn't freeze. するときにpost messages必要です。update the user interfacetask

BackgroundWorkerクラスを使用すると、ユーザー インターフェイスで操作の進行状況、完了、およびキャンセルを示すことができます。たとえば、バックグラウンド操作がユーザーに対して実行されているかどうかを確認completedできcanceledますdisplay a message

簡単なチュートリアルを読む

于 2012-06-14T12:41:08.403 に答える
2

TPL など、独自のスレッドを開始する (そして 4.5 フレームワークで待機する) 非同期で実行する方法は複数ありますが、winforms の場合、おそらく最も簡単な方法はBackGroundWorkerコンポーネントを追加することです。デザイナーのツールボックスからドラッグ アンド ドロップするだけです。

追加されたコンポーネントをダブルクリックすると、backgroundworker の DoWork イベントをキャッチするメソッドが自動的に作成され、そこにコードを配置できます。次に、送信ボタンで呼び出すだけです

  backgroundWorker.RunWorkerAsync();
于 2012-06-14T12:39:22.443 に答える
2

次に、BackgroundWorker クラスを使用する必要があります。

于 2012-06-14T12:39:23.050 に答える
0

良い例を次に示します。

http://www.ricky-dev.com/2012/05/throttled-processing-of-multiple-asynchronous-tasks/

于 2012-06-14T12:43:27.760 に答える
0

いくつかの方法。プロセスを呼び出し、完了すると終了するバックグラウンド ワーカー スレッドを開始できます。デリゲートを作成して、BeginInvoke を使用できます。サービスのリスナーがプロセスをデパッチして実行することを通知するメッセージを送信できます。その猫の皮を剥ぐ方法はたくさんあります。

これは、古いが有用な MSDN ref http://msdn.microsoft.com/en-us/magazine/cc301332.aspxです。

于 2012-06-14T12:43:47.087 に答える
0

アプリケーションを閉じて、ライブラリ メソッドを非同期で呼び出す必要があります。

アプリケーションが閉じられる前にデータを送信する場合は、フォームが閉じようとしているときに処理するイベントを変更します。このイベントは、ユーザーがフォームを閉じた場合にのみ発生することを理解してください。プロセスが強制終了されたときにカバーしたい場合は、そのイベントにサブスクライブする必要があります。

さらに、プロセスを閉じて、これらのイベントが発生しないようにする方法があります。基本的に、このソリューションは、プロセスが閉じていることを Windows に報告する場合にのみ機能します。

もちろん、プログラムのプロセスが終了しようとしている場合は、非同期でデータを送信するべきではありません。

于 2012-06-14T13:35:12.447 に答える
0

別のスレッドで開始するだけです。例えば:

Thread thread = new Thread(new ParameterizedThreadStart(AOTHelper.AccountToProcess));
thread.Start(Acct.AcctID);

ただし、同時に多くのスレッドを開始する場合は、代わりにスレッド プールを使用する必要があります。

ただし、注意が必要です。別のスレッドで呼び出すメソッドは、UI で何もできないか、例外をスローします。UI に対して何かを行う必要がある場合は、フォームまたはコントロールへの参照が必要になります。これにより、そのオブジェクトの Invoke メソッドを呼び出して UI スレッドに戻ることができます。また、非同期で行われているため、呼び出し直後にそのメッセージ ボックスを表示することはできなくなります。これは、作業が完了する直前に表示されるためです。

于 2012-06-14T12:46:23.590 に答える