2011-03-02 7 views
0

WCFクライアントを使用してサーバーからデータを取得するアプリケーションを構築しています。C#winformアプリケーションとスレッド化されたWCFクライアント

多くのユーザーがUIを変更する必要があり、アプリからの応答を失いたくないため、サービスへの呼び出しが非同期であることを希望します。

私は*Completed*Asyncを使用してみました:

ServiceUserClient client = new ServiceUserClient(); 
client.FindUserCompleted += delegate(object sender, FindUserCompletedEventArgs e) 
{ 
    // here e.Result always fails 
}; 
client.FindUserAsync(text); 

*完成したデリゲートの内部で、私は常にエラーを取得します(接続がリモートホストによって閉じ:私は、私は見つけることができるすべてのログを有効にしますが、私はまだ理由を理解していませんこれらのエラーが発生します)

同期呼び出しは常に機能します。

私はサービスへのすべての呼び出しを処理するクラスを持っています。

スレッドクラスのような内部で同期呼び出しを行う方法はありますか?

+0

あなたはまた、クライアントとサーバーの両方でトレースWCFを使用しましたか? http://msdn.microsoft.com/en-us/library/ms733025.aspx –

+0

はい、私はまだ私にこのエラーを与える理由を理解できません:net.tcpへの接続を確立しようとしている間、操作が中断されました:// /。 – Keeper

+0

e.Resultを取得する前に必ずe.Errorをチェックします。 e.Errorとは何ですか? –

答えて

0

は、私はこの方法のBackgroundWorkerを使用して独自の非同期メソッドを作成することになった(おそらくない最高方法は、それは動作します):

// this is the click event on my search button 
private void FindUser_Click(object sender, EventArgs e) 
{ 
    this.UserListSearch.Enabled = false; 
    this.UserListSearch.Items.Clear(); 
    Model.FindUser(FindText.Text.ToUpper(), userlist => 
    { 
     foreach (User u in userlist) 
     { 
      ListViewItem item = new ListViewItem(u.UserName); 
      item.Name = u.UserName; 
      item.SubItems.Add(u.Description); 
      this.UserListSearch.Items.Add(item); 
     } 
     this.UserListSearch.Enabled = true; 
    }); 
} 

// this is the function I call when I need async call 
public void FindUser(string text, Action<User[]> callback) 
{ 
    CreateBackgroundWorker<User[]>(() => 
     { 
      ServiceUsersClient client = new ServiceUsersClient(); 
      var results = client.FindUser(text); 
      client.Close(); 
      return results; 
     }, callback); 
} 

// this is my utility function to create a bgworker "on demand" 
private void CreateBackgroundWorker<T>(Func<T> dowork, Action<T> callback) 
{ 
    BackgroundWorker worker = new BackgroundWorker(); 
    worker.DoWork += (sender, args) => 
    { 
     T result = dowork.Invoke(); 
     (callback.Target as Form).Invoke(callback, result); 
    }; 
    worker.RunWorkerAsync(); 
} 
0

クライアント側のバインディングを、サーバーが受け入れるものと一致するように設定していますか?

また、WCFテストクライアント(通常は%Program Files%\ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ WcfTestClient.exe)でテストする必要があります。テストクライアントが動作している場合は、バインディングを確認します。

あなたの電話はサーバーにも届いていますか?サーバーからクライアントへの応答をシリアライズするときにも同様のエラーが発生しているので、確認してください。あなたのサーバーに到達すると、バインディングは問題ではなく、むしろシリアル化の問題があります。サーバー上でデシリアライズしようとしているデータモデルのプロパティに "セット"がありますか?

私はこれが答えではないことを知っていますが、私はコメントを許可するのに十分ではなかった...そして、私はあなたがどこにいても、完全にイライラしています。

+0

彼は同期呼び出しが働くので、 。 –

+0

私はそれを今参照してください...ありがとう。多分クライアントかWCFStormを試してみませんか? – ale

関連する問題