C# 等待任务不执行';我无法与IEnumerable一起工作
我试图异步执行一个现有的同步方法,但是如果该方法是C# 等待任务不执行';我无法与IEnumerable一起工作,c#,asynchronous,async-await,task,C#,Asynchronous,Async Await,Task,我试图异步执行一个现有的同步方法,但是如果该方法是IEnumerable,那么它似乎跳过了该方法 这是我试图实现的一个简化版本 public partial class MainWindow : Window { private IEnumerable<int> _Result; public MainWindow() { InitializeComponent(); DoSomethingAmazing(); }
IEnumerable
,那么它似乎跳过了该方法
这是我试图实现的一个简化版本
public partial class MainWindow : Window
{
private IEnumerable<int> _Result;
public MainWindow()
{
InitializeComponent();
DoSomethingAmazing();
}
private async void DoSomethingAmazing()
{
_Result = await DoSomethingAsync();
}
private IEnumerable<int> DoSomething()
{
Debug.WriteLine("Doing something.");
//Do something crazy and yield return something useful.
yield return 10;
}
private async Task<IEnumerable<int>> DoSomethingAsync()
{
//Perform the DoSomething method asynchronously.
return await Task.Run(() => DoSomething());
}
}
公共部分类主窗口:窗口
{
私有IEnumerable_结果;
公共主窗口()
{
初始化组件();
DoSomethingAmazing();
}
私有异步void DoSomethingAmazing()
{
_结果=等待DoSomethingAsync();
}
私有IEnumerable DoSomething()
{
Debug.WriteLine(“做某事”);
//做一些疯狂的事情,并回报一些有用的东西。
收益率10;
}
专用异步任务DoSomethingAsync()
{
//异步执行DoSomething方法。
返回等待任务。运行(()=>DoSomething());
}
}
基本上,当创建main窗口时,它将触发一个异步方法来填充\u Result
字段
现在,DoSomething
从未真正执行过。调试消息从未出现
如果我将IEnumerable
更改为List
,则一切正常。执行该方法并填充结果
我想使用IEnumerable
的主要原因是因为我想使用yield return
,这不完全是一个要求,但主要只是一个偏好。我遇到了这个问题,从那以后我一直在挠头。改变你的剂量-精氨酸-丙种球蛋白混合方法,它就会起作用
private async void DoSomethingAmazing()
{
_Result = await DoSomethingAsync();
foreach (var item in _Result)
{
Debug.WriteLine(item);
}
}
改变你的剂量-精氨酸配伍方法,它就会起作用
private async void DoSomethingAmazing()
{
_Result = await DoSomethingAsync();
foreach (var item in _Result)
{
Debug.WriteLine(item);
}
}
运行DoSomething
方法的结果是一个实现IEnumerable
的类,当您枚举它时,它将运行您的代码。您的问题与使用异步无关。如果您运行以下代码
var result = DoSomething();
Debug.WriteLine("After running DoSomething");
var resultAsList = result.ToList();
Debug.WriteLine("After enumerating result");
您将获得此输出
运行DoSomething之后
做点什么
枚举结果后
运行DoSomething
方法的结果是一个实现IEnumerable
的类,当您枚举它时,它将运行您的代码。您的问题与使用异步无关。如果您运行以下代码
var result = DoSomething();
Debug.WriteLine("After running DoSomething");
var resultAsList = result.ToList();
Debug.WriteLine("After enumerating result");
您将获得此输出
运行DoSomething之后
做点什么
枚举结果后
现在,DoSomething从未真正执行。调试消息从不显示
出现了
这是因为当您使用yield return
时,编译器将为您生成一个实现IEnumerable
的类,并返回迭代器。看起来是这样的:
Program.<DoSomething>d__3 expr_07 = new Program.<DoSomething>d__3(-2);
expr_07.<>4__this = this;
return expr_07;
Program.d_uu3 expr_07=新的Program.d_u3(-2);
expr_07.4__this=此;
返回expr\u 07;
其中d_uu3
是编译器生成的类,实现IEnumerable
现在,因为迭代器使用延迟执行,所以除非您显式地迭代它,否则它不会开始执行,而您没有这样做
如果我将IEnumerable更改为List,那么一切都很好。该方法得到
执行并填充结果
这是因为当您使用列表时,您正在具体化迭代器,有效地使其执行。这就是为什么会出现调试消息
现在,DoSomething从未真正执行。调试消息从不显示
出现了
这是因为当您使用yield return
时,编译器将为您生成一个实现IEnumerable
的类,并返回迭代器。看起来是这样的:
Program.<DoSomething>d__3 expr_07 = new Program.<DoSomething>d__3(-2);
expr_07.<>4__this = this;
return expr_07;
Program.d_uu3 expr_07=新的Program.d_u3(-2);
expr_07.4__this=此;
返回expr\u 07;
其中d_uu3
是编译器生成的类,实现IEnumerable
现在,因为迭代器使用延迟执行,所以除非您显式地迭代它,否则它不会开始执行,而您没有这样做
如果我将IEnumerable更改为List,那么一切都很好。该方法得到
执行并填充结果
这是因为当您使用列表时,您正在具体化迭代器,有效地使其执行。这就是出现调试消息的原因。您从未枚举返回的IEnumerable
。应避免使用异步void方法,并将其设置为异步任务返回类型(对于DoSomethingAmazing)。有关async void的更多信息,请参阅此问题的答案。您从未枚举返回的IEnumerable
。您应该避免使用async void方法,并将其设置为async任务返回类型(对于DoSomethingAmazing)。有关async void的更多信息,请参见对不同问题的回答