15

メソッドとのインターフェースがありますINetwork

Task<bool> SendAsync(string messageToSend, CancellationToken ct)

インターフェイスの 1 つの実装には、次のようなコードがあります。

public async Task<bool> SendAsync(string messageToSend, CancellationToken ct)
{
  var udpClient = new UdpClient();
  var data = Encoding.UTF8.GetBytes (messageToSend);
  var sentBytes = await udpClient.SendAsync(data);
  return sentBytes == data.Length; 
}

残念ながら、SendAsync()クラスのUdpClientは を受け入れませんCancellationToken

だから私はそれを次のように変更し始めました:

public Task<bool> SendAsync(string messageToSend, CancellationToken ct)
{
  var udpClient = new UdpClient();
  var data = Encoding.UTF8.GetBytes (messageToSend);
  var sendTask = udpClient.SendAsync(data);
  sendTask.Wait(ct);

  if(sendTask.Status == RanToCompletion)
  {
    return sendTask.Result == data.Length;
  }
}

Task返されないため、明らかにこれは機能しません。ただし、タスクを返すと、署名が一致しなくなります。SendAsync()を返しますがTask<int>、 が必要Task<bool>です。

そして今、私は混乱しています。:-) これを解決するには?

4

3 に答える 3

1

まず、 を返したい場合はTask<bool>、 を使用して簡単に行うことができますTask.FromResult()。しかし、おそらくそうすべきではありません。実際に同期する async メソッドを使用してもあまり意味がありません。

それとは別に、メソッドがキャンセルされていなくても、キャンセルされたふりをするべきではないと思います。できることは、実際の を開始する前にトークンを確認することですが、SendAsync()それだけです。

メソッドができるだけ早くキャンセルされたふりをしたい場合はContinueWith()、キャンセルを使用できます。

var sentBytes = await sendTask.ContinueWith(t => t.Result, ct);
于 2013-10-16T15:19:26.240 に答える
0

あなた自身にメッセージを送ることをお勧めします。「やめて」というメッセージ。

于 2021-12-23T13:06:25.557 に答える