我有一个接口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
永远不会为false,而且只有当您使用占用多于一个字节的字符时,data.Length != messageToSend.Length
才成立。 - Scott ChamberlainSendAsync
上等待时,只需返回任务即可,如果失败,它将抛出异常。 - Scott Chamberlain