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

时间:2016-10-21 11:05:02

标签: 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分钟?我收到了这个错误:

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

任何人都知道发生了什么事?

1 个答案:

答案 0 :(得分:0)

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

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

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

可以在以下位置找到了解异步/等待模式的良好参考:https://markheath.net/post/async-antipatterns