3

私は WCF 非同期呼び出しを練習していますが、非同期で実行することはできません。

コードはとてもシンプルです

protected void btnGetEvals_Click(object sender, EventArgs e)
{
    EvalServiceClient client = new EvalServiceClient("BasicHttpBinding_IEvalService");
    client.GetEvalsCompleted += client_GetEvalsCompleted;
    client.GetEvalsAsync();
    Label1.Text = "Waiting...";
    //client.Close();
}

void client_GetEvalsCompleted(object sender, GetEvalsCompletedEventArgs e)
{
    GridView1.DataSource = e.Result;
    GridView1.DataBind();             
}

そしてサービスはこちら

public class EvalService : IEvalService
{
    List<Eval> evals = new List<Eval>();

    public void SubmitEval(Eval eval)
    {
        evals.Add(eval);
    }

    public List<Eval> GetEvals()
    {
        Thread.Sleep(5000);
        return evals;
    }
}

btnGetEvals をクリックすると、サービスが実行されて eval が返される間、すぐに "Waiting..." と表示されます。代わりに、どちらも 5 秒かかり、「待機中...」の評価が同時に表示されます。

完了したコールバックでクライアントを閉じることを提案するthisを見つけたので、今のところコメントアウトしました (完了したコールバックでクライアントを閉じる方法がわからないためです。その部門の助けもいただければ幸いです)。まあ、それは役に立ちませんでした。はい、私のサービス参照はすでに非同期操作を許可するように設定されています。

私はここで少し途方に暮れています。助言がありますか?

4

1 に答える 1

1

これは、WFC 非同期呼び出しを実現する手順の概要です。

  • 関連する 2 つのメソッドを宣言します。1 つはBeginMethodNameとして、もう 1 つはEndMethodNameとして宣言します。
  • 関連するBegin メソッドに[OperationContract(AsyncPattern = true)]を追加します。
  • 対応するEnd メソッドにOperationContract属性を指定しないでください。
  • サービスの実装では、実際の処理はメソッドで行う必要があり、このメソッドは別のスレッドで実行する必要があります。これを実現するには、ThreadPool.QueueUserWorkItem を使用できます。
  • クライアント側では、関連する Begin メソッドを呼び出しますが、この後プロキシを閉じないでください。これは、End メソッドが結果を取得するために同じチャネルを必要とするためです。End メソッドを呼び出した後、クライアントのコールバックで閉じることができます。

WCF 非同期呼び出しを実現するための詳細はすべてここにあります

http://www.codeproject.com/Articles/121345/Asynchronous-Communication-in-a-WCF-Service

于 2013-09-02T22:11:55.297 に答える