2

サーバー通信用の新しいスレッドを開くウィンドウフォームがあります。サーバーがクエリにどのように応答したかをフォーム (テキスト ボックス) に書き込む必要があります。

現時点では、次のようにサーバー通信を行っています。

ServerClass SC = new ServerClass(param);
new Thread(new ThreadStart(SC.serverAction)).Start()

現在の serverAction は ServerClass クラス内の void メソッドですが、もちろん、必要に応じて値を返すようにすることもできます。ただし、デリゲートにもっと傾いていますが、他のスレッドからコールバックする方法がよくわかりません...

ServerClass は、次のように WCF を使用する単純なクラスです。

public class ServerClass
{
  private string var1;
  private string var2;

  public ServerClass(string var1, string var2)
  {
    this.var1 = var1; this.var2 = var2;
  }
  public void serverAction()
  {
    //WCF here
  }
}

「serverAction()」メソッドから値を取得する方法について何か提案はありますか?

4

5 に答える 5

1

新しい .NET Framework 4.0 Async ライブラリを確認することをお勧めします。具体的には、これはあなたにとって興味深いかもしれません: System.Threading.Tasks.Task<T>.

このクラスは、System.Threading.Thread の代わりに使用されます。

于 2012-06-15T17:54:46.810 に答える
0

スレッドは、非同期で実行され、値を返すことができない方法で設計された.netのメソッドおよびスレッドではありません。

ただし、 BackgroundWorkerを使用して値を返すことができます。結果はe.ResultのBackgroundWorkerで取得できます。

さらに、スレッドから値を返すためのさまざまな手法についてこれを確認できます。

于 2012-06-15T18:40:38.753 に答える
0

スレッドのエントリ ポイントから正確に値を返すことはできません。私が提案するのは、Server クラス間のある種の非同期通信です。

次のように、Server クラスでイベントを定義できます。

public event EventHandler<YourEventInformation> OnServerConnected = (s, e) => {};

次に、serverAction の準備ができたら、次のようにします。

YourEventInformation evtInfo [= new YourEventInformation();
evtInfo.CustomReturnValue = "something here";

//Async call in the UI thread
OnServerConnected.BeginInvoke(this, evtInfo, null, null);

次に、UI のどこか (おそらくウィンドウ) からこのイベントにバインドする必要があります。最初に Dispatcher.CheckAccess をチェックしてから UI コードを呼び出すことにより、UI スレッドのコンテキストでコードを呼び出す必要があります。ここで説明されている内容と非常によく似たもの。

于 2012-06-15T18:02:04.930 に答える
0

代わりにイベントの使用を検討してください。スレッド操作が完了したときにイベントを発生させます。

于 2012-06-15T17:55:40.360 に答える