string serverName = null;
var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(30));
Task.Run(() => serverName = Server.GetServerName(), cancellationTokenSource.Token);
В таком случае вызов Server.GetServerName() будет происходить в фоне и не заблокирует основной поток. Теоретически через 30 секунд задача будет отменена. Но по факту задача будет висеть в режиме ожидание ответа по сети до тех пор, пока ответ не придет, и только после того как придет ответ будет выбран свободный поток из пула, который возьмет эту задачу для продолжения выполнения и возможно прервет её, но возможно что и не прервет.
Если вам гарантированно нужно чтобы задача не выполнилась после истечения 30 секунд, то нужно переделать метод GetServerName() следующим образом:
public string GetServerName(CancellationToken cancellationToken)
{
// здесь непосредственно вызов по сети
cancellationToken.ThrowIfCancellationRequested();
}
либо:
public string GetServerName(CancellationToken cancellationToken)
{
// здесь непосредственно вызов по сети
if (cancellationToken.IsCancellationRequested)
{
return;
}
}
ну и соответственно его вызов будет выглядеть в таком случае вот так:
Server.GetServerName(cancellationTokenSource.Token)