.NET 4.5 中 FromCancelled (CancellationToken) 的等价物是什么?

问题描述 投票:0回答:1

我想在.NET 4.5中实现类似的东西:

public virtual Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
{
    if (!cancellationToken.IsCancellationRequested)
    {
        return BeginEndWriteAsync(buffer, offset, count);
    }

    return Task.FromCancellation(cancellationToken);
}

Task.FromCanceled(CancellationToken)
方法在 .NET 8 中可用

我想知道 .NET 4.5 中的等效项。

c# task .net-4.5
1个回答
1
投票

在 .NET 4.5 中,没有与 .NET 8 中的 Task.FromCanceled(CancellationToken) 方法直接等效的方法。但是,您可以通过手动创建已取消的任务来实现类似的行为。

以下是在 .NET 4.5 中创建已取消任务的方法:

using System;
using System.Threading;
using System.Threading.Tasks;

public class Example
{
    public static Task CreateCanceledTask(CancellationToken cancellationToken)
    {
        if (cancellationToken.IsCancellationRequested)
        {
            // Create a canceled task with the specified cancellation token.
            var tcs = new TaskCompletionSource<object>();
            tcs.SetCanceled();
            return tcs.Task;
        }
        else
        {
            // Return a non-canceled task.
            return Task.FromResult<object>(null);
        }
    }

    public static async Task Main()
    {
        var cancellationToken = new CancellationToken(/* true or false */);
        var task = CreateCanceledTask(cancellationToken);

        try
        {
            await task;
        }
        catch (TaskCanceledException)
        {
            Console.WriteLine("Task was canceled.");
        }
    }
}

在CreateCanceledTask方法中:

如果请求取消令牌(即需要取消),我们使用 TaskCompletionSource 创建一个已取消的任务并将其设置为已取消。 否则,我们使用 Task.FromResult 返回一个未取消的任务。 请记住将 /* true 或 false */ 注释替换为您实际的取消条件(无论您是否希望任务被取消)。

此方法允许您模仿 .NET 4.5 中 Task.FromCanceled(CancellationToken) 的行为

© www.soinside.com 2019 - 2024. All rights reserved.