【问题标题】:Task always on status Waiting for Activation (finding all serial devices)任务始终处于等待激活状态(查找所有串行设备)
【发布时间】:2019-05-27 19:59:53
【问题描述】:

目前我有一个问题,这段代码给了我一个总是在等待激活状态的任务。

public static void GetAvailablePorts(List<string> ports, int timeOut)
    {
        var selector = SerialDevice.GetDeviceSelector();
        var task = DeviceInformation.FindAllAsync(selector).AsTask();
        Int64 i = 0;
        bool done = false;
        while (!done)
        {
            Debug.WriteLine(String.Format("Index: {0}, State: {1}, Id: {2}", i, task.Status.ToString(), task.Id));
            i++;
            if(TaskStatus.RanToCompletion == task.Status)
                done = true;
        }

        var devices = task.Result;
        foreach (var d in devices)
        {
            ports.Add(d.Id);
        }
    }

这里是我运行这篇文章时的一些调试信息。有谁知道问题出在哪里。

在调试输出中(结束):

 Index: 7496, State: WaitingForActivation, Id: 21
 Index: 7497, State: WaitingForActivation, Id: 21
 Index: 7498, State: WaitingForActivation, Id: 21
 Index: 7499, State: WaitingForActivation, Id: 21
 Index: 7500, State: WaitingForActivation, Id: 21
 Index: 7501, State: WaitingForActivation, Id: 21
 Index: 7502, State: WaitingForActivation, Id: 21
 Index: 7503, State: WaitingForActivation, Id: 21

不同运行的任务窗口,但应用于相同目的: Task Window

更新:

如果我这样做,90% 的时间它不会进入 continueWith。有点奇怪。

var selector = SerialDevice.GetDeviceSelector();
        return DeviceInformation.FindAllAsync(selector).AsTask().ContinueWith((Task<DeviceInformationCollection> previous) =>
        {
            var devices = previous.Result;
            foreach (var d in devices)
            {
                ports.Add(d.Id);
            }
            string b = "";
        });

更新 2:

过了一段时间。 15 分钟?我得到了这个错误:

对 ASTA(线程 9164)的 COM 调用(IID:{45180254-082E-5274-B2E7-AC0517F44D07},方法索引:8)出现死锁并超时。)

有人知道怎么回事吗?

【问题讨论】:

  • 你应该开始任务了。
  • 如果您在单个线程上运行,而 (!done) 将阻塞该线程,并且没有任何东西可以更改 RanToCompletion 状态。您不应该使用 await 或 .Continue 进行异步编程
  • 这是一个承诺风格的任务。该任务不应该自动启动吗?
  • 如果我使用 await 它只会挂起,所以我以这种方式重构了我的代码以查看发生了什么。
  • 我认为你在 FindAllAsync 方法中有一些死锁。

标签: c# asynchronous task


【解决方案1】:

您需要对代码进行一些更改。

你应该写public async Task GetAvailablePorts而不是public static void GetAvailablePorts

然后你应该写var devices = await task;而不是var devices = task.Result;

了解异步/等待模式的一个很好的参考可以在这里找到:https://markheath.net/post/async-antipatterns

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-11
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多