我正在尝试创建一个函数,尝试在特定时间异步连接到主机,然后检查是否已建立连接。
我的问题是我无法为此异步连接添加持续时间。
我的功能:
public async Task<bool> IsConnected()
{
// Host IP Address and communication port
string ipAddress = "192.168.0.11";
int port = 9100;
//Try to Connect with the host during 2 second
{
// Create TcpClient and try to connect
using (TcpClient client = new TcpClient())
{
Task<bool> mytask = client.ConnectAsync(ipAddress, port).Wait(TimeSpan.FromSeconds(2));
bool isconnected = await mytask;
if (isconnected)
{
//Connection with host
return true;
}
else
{
// No connection with host
return false;
}
//Close Connection
client.Close();
}
}
catch (Exception exception)
{
// Problem with connection
return false;
}
}
我有这个错误:
Cannot implicitly convert type 'bool' to 'System.Threading.Tasks.Task<bool>' at line :
Task<bool> mytask = client.ConnectAsync(ipAddress, port).Wait(TimeSpan.FromSeconds(2));
我到处搜索,没有找到解决方案。
感谢帮助
丹尼尔
工作解决方案:
public async Task<bool> IsConnected()
{
// Host IP Address and communication port
string ipAddress = "192.168.0.11";
int port = 9100;
//Try to Connect with the host during 2 second
{
// Create TcpClient and try to connect
using (TcpClient client = new TcpClient())
{
//Create Tasks
var clientTask = client.ConnectAsync(ipAddress, port);
var delayTask = Task.Delay(2000);
//Check which one finish first
var completedTask = await Task.WhenAny(new[] {clientTask, delayTask});
//Check if the connection have been established before the end of the timer
return completedTask == clientTask;
}
}
catch (Exception exception)
{
// Problem with connection
return false;
}
}
最佳答案
再添加一个延时任务,然后使用Task.WhenAny
返回第一个完成的任务。
通过将已完成的任务与客户端任务进行比较,您将“决定”哪个任务先完成
public async Task<bool> IsConnected()
{
using (TcpClient client = new TcpClient())
{
var clientTask = client.ConnectAsync(ipAddress, port);
var delayTask = Task.Delay(2000);
var completedTask = await Task.WhenAny(new[] {clientTask, delayTask});
return completedTask == clientTask;
}
}
注意 ConnectAsync
方法返回 Task
不是 Task<bool>
.
异步方法返回类型为Task
的值.任务包含有关异步方法状态的信息(完成、运行、故障等)
通过“等待”,您将等待并观察任务的结果(完成或因异常而出错)
基本上是这样
// start connecting to host
var clientTask = client.ConnectAsync(ipAddress, port);
// start calculating elapsed time
var delayTask = Task.Delay(2000);
和await Task.WhenAny
将返回最先完成的第一个任务,如果第一个任务出现异常则抛出异常。
关于C# - 具有特定持续时间的 TcpClient 异步连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41507750/