相关疑难解决方法(0)

async-await threading internals

我很好奇异步等待线程内部.

每个人都声明async在性能方面要好得多,因为它释放了等待长异步调用响应的线程.好的我明白了.

但让我们考虑一下这种情况.

我有一个异步方法在数据库上执行异步操作.数据库的api公开函数BeginQuery和事件QueryCompleted.我用任务包装了那些(使用TaskCompletionSource).

我的问题是调用BeginQuery和触发事件QueryCompleted之间的内幕.

我的意思是 - 它不需要产生某种工人来解雇事件吗?在非常低的级别,它必须是一些阻止来自db的线程读取结果的同步循环.

我认为任何异步调用都必须生成一个线程来实际处理响应(可能在驱动程序代码中的低级c ++循环中等待它).

所以我们唯一的"收获"是当一些其他线程正在执行其工作时,可以释放调用者线程.

调用异步方法总是创建一个新的工作线程吗?

有人可以证实我的理解吗?

.net c# asynchronous async-await

22
推荐指数
3
解决办法
4387
查看次数

取消长时间运行任务后如何正确清理

我创建了一个类,其目的是抽象出对队列的并发访问的控制.

该类被设计为在单个线程上实例化,由多个线程写入,然后从后续的单个线程读取.

我在类中生成了一个长时间运行的任务,它将执行阻塞循环并在项成功出列时触发事件.

我的问题是:我执行取消长时间运行的任务并随后清理/重置CancellationTokenSource对象的正确用法吗?

理想情况下,我希望能够在保持可用性添加到队列的同时停止并重新启动活动对象.

我用Peter Bromberg的文章作为基础:C#4.0中的生产者/消费者队列和BlockingCollection

代码如下:

using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;

namespace Test
{
    public delegate void DeliverNextQueuedItemHandler<T>(T item);

public sealed class SOQueueManagerT<T> 
{

    ConcurrentQueue<T> _multiQueue;
    BlockingCollection<T> _queue;
    CancellationTokenSource _canceller;
    Task _listener = null;

    public event DeliverNextQueuedItemHandler<T> OnNextItem;

    public bool IsRunning { get; private set; }
    public int QueueSize
    {
        get
        {
            if (_queue != null)
                return _queue.Count;
            return -1;
        }
    }

    public CancellationTokenSource CancellationTokenSource
    {
        get
        {
            if (_canceller == null) …
Run Code Online (Sandbox Code Playgroud)

c# concurrency task-parallel-library cancellation c#-4.0

6
推荐指数
1
解决办法
3020
查看次数