Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 任务始终处于等待激活状态(查找所有串行设备)_C#_Asynchronous_Task - Fatal编程技术网

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

C# 任务始终处于等待激活状态(查找所有串行设备),c#,asynchronous,task,C#,Asynchronous,Task,目前我有一个问题,这段代码给了我一个任务,它总是在等待激活状态 public static void GetAvailablePorts(List<string> ports, int timeOut) { var selector = SerialDevice.GetDeviceSelector(); var task = DeviceInformation.FindAllAsync(selector).AsTask(); I

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

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);
        }
    }
不同运行的任务窗口,但应具有相同的用途:

更新:

如果我这样做的话,90%的时间都不会持续下去。有点奇怪

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 = "";
        });
var选择器=SerialDevice.GetDeviceSelector();
返回设备信息.FindAllAsync(选择器).AsTask().ContinueWith((上一个任务)=>
{
var设备=先前的结果;
foreach(设备中的var d)
{
端口。添加(d.Id);
}
字符串b=“”;
});
更新2:

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

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


有人知道发生了什么吗?

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

您应该编写
公共异步任务getavailableport

然后在后面代替
var devices=task.Result您应该编写
var设备=等待任务


可以在此处找到理解异步/等待模式的好参考:

您应该启动任务。如果您在单个线程上运行,而(!done)将阻止该线程,并且任何内容都无法更改RANTO完成状态。对于异步编程,不应使用wait或.Continue执行此操作。这是一项承诺式任务。该任务不应该自动启动吗?如果我使用wait,它将挂起,因此我以这种方式重构代码以查看发生了什么。我认为findalsync方法中存在一些死锁。
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 = "";
        });