【发布时间】:2021-12-23 21:06:25
【问题描述】:
我有一个带有方法的接口INetwork:
Task<bool> SendAsync(string messageToSend, CancellationToken ct)
接口的一个实现有这样的代码:
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;
}
很遗憾,UdpClient 类的 SendAsync() 不接受 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>。
现在我很困惑。 :-) 如何解决?
【问题讨论】:
-
在它的默认模式下,我认为
sendTask.Result == data.Length永远不会是假的,而data.Length != messageToSend.Length唯一一次是当您使用使用超过一个字节来表示的字符时。 -
@ScottChamberlain 可能是。但改变不了问题。如果接口想要一个 bool 来指示发送成功,如何从 Task
获取 Task 。 -
只需从
SendAsync返回任务,当你等待它时,如果它失败了它会抛出一个异常。 -
@ScottChamberlain 我无法从 SendAsync() 返回任务。它是 Task
但接口中方法的签名需要 Task .
标签: c# asynchronous async-await