これは、私が使用しようとしている非同期応答を持つ 3 層アプリケーションのモデルです。
- GUI
- バックエンド
- リモートサーバー
GUI:
private async void readFloatButton_Click(object sender, RoutedEventArgs e)
{
FloatValueLabel.Content = (await srvProtocol.ReadFloat("ReadFloatX")).ToString();
}
バックエンド (内部変数binReaderおよびconnection を使用)
public Task<float> ReadFloat(string cmd)
{
var tcs1 = new TaskCompletionSource<float>();
var floatTask = tcs1.Task;
RegisterResponse(cmd,
() =>
tcs1.SetResult(_binReader.ReadSingle());
);
// We are ready: now send request to server(assuming that this is a quick operation)
connection.Send(cmd);
return floatTask;
}
ここで、RegisterResponse は < Key, Action > のペアをスレッドセーフなディクショナリに追加します。別のワーカー スレッドがネットワーク ストリーム メッセージ (メッセージ ヘッダー) から読み取り、メッセージ ヘッダーにある文字列 cmd に従ってアクションを呼び出します。
今質問:
- 定期的な更新 (単一のコールバックではない) のために GUI 要素をサブスクライブする必要がある場合、同じレベルの簡潔さに到達することは可能ですか?