gpt4 book ai didi

c# - 等待自定义函数

转载 作者:行者123 更新时间:2023-11-30 14:10:54 25 4
gpt4 key购买 nike

我正试图了解 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 以将主题添加到列表中,然后继续。

所以我的问题是:

  1. 为什么这段代码不起作用?您应该如何制作一个本身不使用任何异步方法的自定义异步方法?
  2. 您应该如何使用异步方法?您不能使用 await 除非您在异步函数中,并且您不应该在没有等待的情况下调用异步方法,那么您如何首先从同步方法调用该方法?

最佳答案

您没有开始任务 - 因此它永远不会完成。

使用 Task.Run 而不是 new Task 它将为您创建并启动任务。

请注意,您仍在同步读取文件,这并不理想……如果您的 Subject 构造函数真的需要那么长时间才能完成,我d 质疑它是否应该是构造函数。

关于c# - 等待自定义函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21934459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com