加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 等待自定义功能

发布时间:2020-12-16 02:00:12 所属栏目:百科 来源:网络整理
导读:我试图了解C#中新的异步功能,到目前为止,我注意到的最奇怪的事情是异步功能的每个示例都有一个等待框架中定义的另一个异步函数的函数,但没有一个有自定义代码. 例如,我想要的是从文本文件中的每一行创建一个对象,但是异步,以便UI线程不会冻结: async Task R
我试图了解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,并且你不应该在没有等待的情况下调用异步方法,那么如何从同步方法中调用该方法呢?

解决方法

Why does this code not work? How are you supposed to make a custom async method that doesn’t use any async methods itself?

使用await Task.Run或等待Task.Factory.StartNew来创建和运行任务.调用新任务将创建一个尚未启动的任务.在大多数情况下,这是不必要的,但您可以在以这种方式创建的任务上调用Start.

How are you supposed to use async methods? You can’t use await unless you’re in an async function,and you’re not supposed to call an async method without await,so how do you first call that method from a synchronous method?

适当的“root”异步调用取决于应用程序的类型:

>在控制台应用程序中:等待返回的任务.>在GUI应用程序中:使用async void事件处理程序.>在ASP.NET MVC中:控制器可以返回Task.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读