c# – 等待自定义功能
我试图了解C#中新的异步功能,到目前为止,我注意到的最奇怪的事情是异步功能的每个示例都有一个等待框架中定义的另一个异步函数的函数,但没有一个有自定义代码.
例如,我想要的是从文本文件中的每一行创建一个对象,但是异步,以便UI线程不会冻结: async Task Read() { string[] subjectStrings = File.ReadAllLines(filePath); for (int i = 0; i < subjectStrings.Length; i++) { Task<Subject> function = new Task<Subject>(code => new Subject((string)code),subjectStrings[i]); try { Subject subject = await function; subjects.Add(subject); } catch (Exception ex) { debugWriter.Write("Error in subject " + subjectStrings[i]); continue; } } } 如您所见,我定义了一个任务,该任务基于文本文件中的一行创建一个新的Subject对象,然后等待此任务.如果我这样做,调试器将启动到await行,然后停止.据我所知,没有更多的代码运行. 如果我使用的是旧的异步功能,我只需使用Task.ContinueWith()并添加一个回调lambda,将主题添加到列表中,然后继续使用. 所以我的问题是: >为什么这段代码不起作用?您如何制作不使用任何异步方法本身的自定义异步方法? 解决方法
使用await Task.Run或等待Task.Factory.StartNew来创建和运行任务.调用新任务将创建一个尚未启动的任务.在大多数情况下,这是不必要的,但您可以在以这种方式创建的任务上调用Start.
适当的“root”异步调用取决于应用程序的类型: >在控制台应用程序中:等待返回的任务.>在GUI应用程序中:使用async void事件处理程序.>在ASP.NET MVC中:控制器可以返回Task. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |