C# 带取消的WriteLineAsync

C# 带取消的WriteLineAsync,c#,C#,我将我的方法扩展到了async,但是我希望能够通过用户请求和超时时间来取消,但是WriteLineAsync不支持取消令牌的移交。我尝试了嵌套任务,但不起作用。有人能支持我吗 public async Task tapAsync(int x, int y, int timeouttime) { CancellationTokenSource cts; cts = new CancellationTokenSource(); await Task.Run(async() =

我将我的方法扩展到了
async
,但是我希望能够通过用户请求和超时时间来取消,但是
WriteLineAsync
不支持取消令牌的移交。我尝试了嵌套任务,但不起作用。有人能支持我吗

public async Task tapAsync(int x, int y, int timeouttime)
{
    CancellationTokenSource cts;
    cts = new CancellationTokenSource();
    await Task.Run(async() =>
    {
       try
       {
           cts.CancelAfter(timeouttime);
           await myWriter.WriteLineAsync("input tap " + x.ToString() + " " + y.ToString());
           await myWriter.FlushAsync();
           await Task.Delay(2000);
       }
       catch (OperationCanceledException)
       {
           Console.WriteLine("canceled");
       }
    }, cts.Token);
    cts = null;
}

至少到目前为止,您还不能取消
WriteLineAsync
本身

您最多只能在两次操作之间取消:

public async Task TapAsync(int x, int y, int timeouttime)
{
    CancellationTokenSource cts;
    cts = new CancellationTokenSource();
    cts.CancelAfter(timeouttime);
    return TapAsync(x, y, source.Token);
    await myWriter.WriteLineAsync("input tap " + x.ToString() + " " + y.ToString());
    token.ThrowIfCancellationRequested();
    await myWriter.FlushAsync();
    token.ThrowIfCancellationRequested();
    await Task.Delay(2000, token);
}
为了清晰和灵活,我可能会将其拆分为:

public Task TapAsync(int x, int y, int timeouttime)
{
    CancellationTokenSource cts;
    cts = new CancellationTokenSource();
    cts.CancelAfter(timeouttime);
    return TapAsync(x, y, source.Token);
}

public async Task TapAsync(int x, int y, CancellationToken token)
{
    token.ThrowIfCancellationRequested();
    await myWriter.WriteLineAsync("input tap " + x.ToString() + " " + y.ToString());
    token.ThrowIfCancellationRequested();
    await myWriter.FlushAsync();
    token.ThrowIfCancellationRequested();
    await Task.Delay(2000, token);
}

myWriter的类型是什么?您的文本流将是垃圾。因此,我们不妨结束它并关闭()它,这样会猛拉地板垫,导致异步写入失败。