将异步C#轮询库更新为现代异步范例

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

我有这个(有效的)异步轮询回调循环的基本实现:

    public void Start(ICallback callback)
    {
        if (Callback != null)
            Stop();
        Console.WriteLine("STARTING");
        Callback = callback;
        cancellation = new CancellationTokenSource();
        this.task = Task.Run(() => TaskLoop(), cancellation.Token);
        Console.WriteLine("STARTED");
    }

    public void Stop()
    {
        if(Callback==null)
        {
            Console.WriteLine("ALREADY stopped");
            return;
        }

        Console.WriteLine("STOPPING");
        cancellation.Cancel();
        try
        {
            task.Wait();
        }
        catch (Exception e)
        {
            Console.WriteLine($"{e.Message}");
        }
        finally
        {
            cancellation.Dispose();
            cancellation = null;
            Callback = null;
            task = null;
            Console.WriteLine("STOPPED");
        }
    }

    private void TaskLoop()
    {
        int i = 0;
        while (!cancellation.IsCancellationRequested)
        {
            Thread.Sleep(1000);
            Console.WriteLine("Starting iteration... {0}", i);
            Task.Run(() =>
            {
                //just for testing
                Callback.SendMessage($"Iteration {i} at {System.DateTime.Now}");
            }).Wait();
            Console.WriteLine("...Ending iteration {0}", i++);
        }
        Console.WriteLine("CANCELLED");

实际上是通过COM从非托管C ++调用的,所以这是一个库项目(而回调是COM编组的对象),因此想先测试设计。

我正在切换为使用async范式,想知道它是否应该像在我的方法除垢上撒一些async灰尘并将Wait()调用交换为await一样简单?显然,Thread.Sleep将更改为Task.Delay

我相当确定,COM将为编组目的将一个线程专用于此对象,并且非托管C ++不了解.Net异步模型,因此是否有需要注意的陷阱/陷阱?

.net com task-parallel-library
1个回答
0
投票

非托管C ++不了解.Net异步模型,因此是否有需要注意的陷阱/陷阱?

只是那个。将async / await应用于内部代码(例如TaskLoop)很好,但是您不能让它扩展到COM边界。因此无法将StartStop设置为async

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