我创建一个像这样的BackgroundService:
public class CustomService : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken cancellationToken)
    {
        do
        {
            //...
            await Task.Delay(60000, cancellationToken);
        }
        while (!cancellationToken.IsCancellationRequested);
    }
}
怎么手动取消呢?
我有这样的取消令牌
   static CancellationTokenSource TokenSource= new CancellationTokenSource();
我有一个像这样的阻止集合
BlockingCollection<object> items= new BlockingCollection<object>();
var item = items.Take(TokenSource.Token);
if(TokenSource.CancelPending)
   return;
我打电话的时候
TokenSource.Cancel();
Take不会像它应该的那样继续下去.如果我使用带轮询的TryTake,令牌显示它被设置为已取消.
似乎GetResponseAsync在Async/Await中不接受cancellationToken.所以问题是我如何取消以下程序,只要我需要从响应中收集Cookie:
 using (HttpWebResponse response = (HttpWebResponse) await request.GetResponseAsync())
 {
    cookies.Add(response.Cookies);
 }
实现上述目标的替代代码也是受欢迎的.
c# httpwebrequest httpwebresponse async-await cancellation-token
我是这个async-await方法的新手C# 5.0,我脑子里几乎没有问题
async如果输入参数或null检查失败,那么转义方法的最佳方法是什么?
return;在Task async方法中使用的逻辑流程是什么(在某些情况下,它变成了无限循环)?
在这种情况下是更合适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);
}
c# asynchronous task-parallel-library async-await cancellation-token
当我创建一个默认的CancellationToken,我可以在该调试器中看到CancellationToken有一个CancellationTokenSource与它存储在私有关联的m_source领域:

我想知道如何对于结构default关键字"将返回结构的每个成员初始化为零或取决于它们是值还是引用类型"并且CancellationTokenSource是引用类型.
CancellationToken确实有2个构造函数设置这个字段然而它们是不相关的,因为default(CancellationToken)不调用构造函数和new CancellationToken()(它具有完全相同的行为)不会调用构造函数,因为结构不能有无参数构造函数(尚未).
我在针对.NET Framework 4.6.1的项目中使用VisualStudio 2017.
玩Task,CancellationToken和本地方法,我来到这个代码:
class Program
{
    static void Main(string[] args)
    {
        CancellationToken o;
        Console.WriteLine(o);
    }
}
哪个编译.现在,如果您将类型更改o为a int或string它将无法编译,则会给出错误:
在访问之前,可能不会初始化局部变量"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);
    }
}
CancellationToken不需要初始化?有趣的事实:如果你将它与本地函数混合,你可以这样写:
class Program
{
    static void Main(string[] args)
    {
        Work();
        CancellationToken …在我们的应用程序中,我们使用async/await和Tasks工作了很多.因此它确实使用Task.Run很多,有时使用内置的取消支持CancellationToken.
public Task DoSomethingAsync(CancellationToken cancellationToken)
{
    return Task.Run(() =>
    {
        while (true)
        {
            if (cancellationToken.IsCancellationRequested) break;
            //do some work
        }
    }, cancellationToken);
}
如果我现在使用CancellationToken取消执行,则执行会在下一个循环开始时停止,或者如果Task根本没有启动,则会抛出异常(Task.Run中的TaskCanceledException).现在的问题是为什么Task.Run使用Exception控制成功取消而不是仅返回已完成的Task.是否有任何具体原因MS没有坚持"不要使用例外来控制执行流程"规则?
如何在一个完全无用的try catch(TaskCancelledException)块中避免使用Boxing支持取消(这很多)的每个方法?
这是我的情况:
    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);
        } …我正在使用取消令牌在 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();
            }
        }
    }
我使用 Postman 执行。
难道我做错了什么?
我正在从以下链接获取帮助
CancellationToken和之间有什么区别CancellationChangeToken?我什么时候使用哪一个?
似乎它们可以用于相同的目的。我缺少什么?
c# ×9
async-await ×3
asp.net-core ×2
.net ×1
.net-core ×1
asynchronous ×1
azure ×1
collections ×1
constructor ×1
struct ×1