【发布时间】:2014-02-21 12:24:58
【问题描述】:
我正在尝试了解 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,除非你在一个异步函数中,而且你不应该在没有等待的情况下调用异步方法,那么你如何首先从同步方法中调用该方法?
【问题讨论】:
-
what you're talking about here 的示例以及为什么不应该这样做...
-
请不要在标题中包含语言标签,除非没有它就没有意义。标记用于此目的。
-
但这仅与C#有关?
-
说,你的
Subject构造函数是什么样的?
标签: c# .net multithreading asynchronous