标签: cancellation-token

如何在ASP.net core中手动取消BackgroundService

我创建一个像这样的BackgroundService:

public class CustomService : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken cancellationToken)
    {
        do
        {
            //...

            await Task.Delay(60000, cancellationToken);
        }
        while (!cancellationToken.IsCancellationRequested);
    }
}
Run Code Online (Sandbox Code Playgroud)

怎么手动取消呢?

c# background-service cancellation-token asp.net-core

15
推荐指数
1
解决办法
2万
查看次数

CancellationToken取消不会破坏BlockingCollection

我有这样的取消令牌

   static CancellationTokenSource TokenSource= new CancellationTokenSource();
Run Code Online (Sandbox Code Playgroud)

我有一个像这样的阻止集合

BlockingCollection<object> items= new BlockingCollection<object>();

var item = items.Take(TokenSource.Token);

if(TokenSource.CancelPending)
   return;
Run Code Online (Sandbox Code Playgroud)

我打电话的时候

TokenSource.Cancel();
Run Code Online (Sandbox Code Playgroud)

Take不会像它应该的那样继续下去.如果我使用带轮询的TryTake,令牌显示它被设置为已取消.

c# collections parallel-processing cancellation-token

14
推荐指数
1
解决办法
7323
查看次数

GetResponseAsync不接受cancellationToken

似乎GetResponseAsync在Async/Await中不接受cancellationToken.所以问题是我如何取消以下程序,只要我需要从响应中收集Cookie:

 using (HttpWebResponse response = (HttpWebResponse) await request.GetResponseAsync())
 {
    cookies.Add(response.Cookies);
 }
Run Code Online (Sandbox Code Playgroud)

实现上述目标的替代代码也是受欢迎的.

c# httpwebrequest httpwebresponse async-await cancellation-token

14
推荐指数
2
解决办法
8339
查看次数

使用"return"终止或退出C#异步方法

我是这个async-await方法的新手C# 5.0,我脑子里几乎没有问题

  1. async如果输入参数或null检查失败,那么转义方法的最佳方法是什么?

  2. return;在Task async方法中使用的逻辑流程是什么(在某些情况下,它变成了无限循环)?

  3. 在这种情况下是更合适CancellationToken还是Task.Yield更合适?

public Func<AzureBlobInfo, string, Task> UploadSuccessCallBackAsync { get; set; }

private async Task OnUploadSuccessAsync(AzureBlobInfo info)
{
    if (this.UploadSuccessCallBackAsync == null)
    {
        return;
    }

    var transactionType = this.FormData.Get("transactionType");
    if (string.IsNullOrEmpty(transactionType))
    {
        transactionType = "unknown";
    }

    await this.UploadSuccessCallBackAsync(info, transactionType);
}
Run Code Online (Sandbox Code Playgroud)

c# asynchronous task-parallel-library async-await cancellation-token

11
推荐指数
1
解决办法
7469
查看次数

默认(CancellationToken)如何具有相应的CancellationTokenSource

当我创建一个默认的CancellationToken,我可以在该调试器中看到CancellationToken有一个CancellationTokenSource与它存储在私有关联的m_source领域:

不是空的

我想知道如何对于结构default关键字"将返回结构的每个成员初始化为零或取决于它们是值还是引用类型"并且CancellationTokenSource是引用类型.

CancellationToken确实有2个构造函数设置这个字段然而它们是不相关的,因为default(CancellationToken)不调用构造函数和new CancellationToken()(它具有完全相同的行为)不会调用构造函数,因为结构不能有无参数构造函数(尚未).

.net c# cancellationtokensource cancellation-token

10
推荐指数
1
解决办法
1854
查看次数

为什么CancellationToken类型的局部变量不需要初始化?

我在针对.NET Framework 4.6.1的项目中使用VisualStudio 2017.

Task,CancellationToken和本地方法,我来到这个代码:

class Program
{
    static void Main(string[] args)
    {
        CancellationToken o;
        Console.WriteLine(o);
    }
}
Run Code Online (Sandbox Code Playgroud)

哪个编译.现在,如果您将类型更改o为a intstring它将无法编译,则会给出错误:

在访问之前,可能不会初始化局部变量"o".

我试图CancellationToken在名为的结构中反编译并复制代码MyCancellationToken.那也不会编译.

我设法编译的唯一情况是一个空结构或包含一个结构的结构CancellationToken.

struct EmptyStruct
{
}

struct MagicStruct
{
    public CancellationToken a;
}

class Program
{
    static void Main(string[] args)
    {
        EmptyStruct a;
        MagicStruct b;
        Console.WriteLine(a);
        Console.WriteLine(b);
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 为什么CancellationToken不需要初始化?
  • 有哪些不需要初始化的类型?

有趣的事实:如果你将它与本地函数混合,你可以这样写:

class Program
{
    static void Main(string[] args)
    {
        Work();

        CancellationToken …
Run Code Online (Sandbox Code Playgroud)

c# constructor struct cancellation-token

10
推荐指数
0
解决办法
86
查看次数

TaskCancellationException如何避免成功控制流程中的异常?

在我们的应用程序中,我们使用async/await和Tasks工作了很多.因此它确实使用Task.Run很多,有时使用内置的取消支持CancellationToken.

public Task DoSomethingAsync(CancellationToken cancellationToken)
{
    return Task.Run(() =>
    {
        while (true)
        {
            if (cancellationToken.IsCancellationRequested) break;
            //do some work
        }
    }, cancellationToken);
}
Run Code Online (Sandbox Code Playgroud)

如果我现在使用CancellationToken取消执行,则执行会在下一个循环开始时停止,或者如果Task根本没有启动,则会抛出异常(Task.Run中的TaskCanceledException).现在的问题是为什么Task.Run使用Exception控制成功取消而不是仅返回已完成的Task.是否有任何具体原因MS没有坚持"不要使用例外来控制执行流程"规则?

如何在一个完全无用的try catch(TaskCancelledException)块中避免使用Boxing支持取消(这很多)的每个方法?

c# task-parallel-library async-await cancellation-token

9
推荐指数
1
解决办法
777
查看次数

正确使用CancellationToken

这是我的情况:

    private CancellationTokenSource cancellationTokenSource;
    private CancellationToken cancellationToken;

    public IoTHub()
    {
        cancellationTokenSource = new CancellationTokenSource();
        cancellationToken = cancellationTokenSource.Token;

        receive();
    }

    private void receive()
    {
        eventHubClient = EventHubClient.CreateFromConnectionString(connectionString, iotHubD2cEndpoint);
        var d2cPartitions = eventHubClient.GetRuntimeInformation().PartitionIds;

        foreach (string partition in d2cPartitions)
        {
            ReceiveMessagesFromDeviceAsync(partition, cancellationToken);
        }
    }

    private async Task ReceiveMessagesFromDeviceAsync(CancellationToken ct)
    {
        var eventHubReceiver = eventHubClient.GetDefaultConsumerGroup().CreateReceiver(partition, DateTime.UtcNow);

        while (true)
        {
            if(ct.IsCancellationRequested)
            {
                break;
            }

            EventData eventData = await eventHubReceiver.ReceiveAsync();
            if (eventData == null) continue;

            string data = Encoding.UTF8.GetString(eventData.GetBytes());

            // Javascript function with Websocket
            Clients.All.setMessage(data);
        } …
Run Code Online (Sandbox Code Playgroud)

c# cancellationtokensource cancellation-token

9
推荐指数
1
解决办法
6199
查看次数

使用带有 Http 触发器的取消令牌的 Azure 函数

我正在使用取消令牌在 Azure 中开发一个函数。它是一个 Http 触发器。

我在方法参数中传入了一个取消令牌。

其长运行功能。我在进程之间取消了请求,但进程继续运行并且取消令牌不生效。

这在 Azure Functions 中是否支持,如果我在两者之间取消 Http 请求,它也应该取消其执行,但事实并非如此。

我通过一小段代码对此进行了测试

public static class LongRunningFunction
    {
        [FunctionName("LongRunningFunction")]
        public static async Task<IActionResult> RunAsync(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post",  Route = "Long")]
            HttpRequest req, ILogger log, CancellationToken token)
        {
            try
            {
                await Task.Delay(10000, token);
                return new OkResult();

            }
            catch (OperationCanceledException)
            {
                return new NotFoundResult();
            }
            catch (Exception e)
            {
                return new InternalServerErrorResult();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我使用 Postman 执行。

难道我做错了什么?

我正在从以下链接获取帮助

c# multithreading azure cancellation-token azure-functions

9
推荐指数
2
解决办法
3415
查看次数

CancellationToken 与 CancellationChangeToken

CancellationToken和之间有什么区别CancellationChangeToken?我什么时候使用哪一个?

似乎它们可以用于相同的目的。我缺少什么?

cancellation-token .net-core asp.net-core

8
推荐指数
1
解决办法
2834
查看次数