c# - 任务始终处于等待激活状态(查找所有串行设备)

标签 c# asynchronous task

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

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)出现死锁并超时。)

有人知道这是怎么回事吗?

最佳答案

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

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

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

可以在此处找到了解异步/等待模式的良好引用:https://markheath.net/post/async-antipatterns

关于c# - 任务始终处于等待激活状态(查找所有串行设备),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40175012/

相关文章:

c# - 将文本框中的文本格式化为百分比

C# WPF 应用程序使用过多内存,而 GC.GetTotalMemory() 较低

c# - 如果在套接字关闭后调用 Socket.BeginSend,则应用程序崩溃而不会抛出异常

c# - 如何在 C# 中的 ContinueWith 之前使用延迟来执行 Task.ContineWith?

c# - 当每个任务都依赖于特定事件时的任务链

c# - WebService GET/POST 调用和 SOAP

ios - 异步请求不进入完成 block

javascript - 对如何在node.js中实现异步回调感到困惑

c# - 将 Action 与 Task 结合使用 - 不确定它是如何工作的

C# Parallel.foreach - 使变量线程安全