Чтобы разрешить исходному потоку отменить задачу, необходимо передать токен отмены и затем пометить отмену через источник отмены.
public class Program
{
public static void Main()
{
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken token = source.Token;
var task=AsyncMain(token);
source.Cancel();
try
{
Console.WriteLine("Main after started thread");
task.Wait();
Console.WriteLine("Main after task finished");
}
catch (AggregateException )
{
Console.WriteLine("Exceptions in Task");
}
}
public static async Task AsyncMain(CancellationToken token)
{
Console.WriteLine("In Thread at Start");
try
{
await Task.Delay(10).ContinueWith(
async task =>
{
Console.WriteLine("Not Cancelled");
}
,token);
}
catch(OperationCanceledException )
{
Console.WriteLine("Cancelled");
}
Console.WriteLine("In Thread after Task");
}
}
Однако, как отметили другие люди, ContinueWith смешивает парагимы, а ненужен в этом случае.Например, вы можете сделать:
public static async Task AsyncMain(CancellationToken token)
{
Console.WriteLine("In Thread at Start");
await Task.Delay(10);
if(!token.IsCancellationRequested)
{
//await Clients.Caller.SendAsync("NoUsersFound");
Console.WriteLine("Not Cancelled");
}
else
{
Console.WriteLine("Cancelled");
}
}
Или вы можете просто проверить, пуст ли список пользователей и обойти необходимость поднять отмену задачи.