Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 等待任务不执行';我无法与IEnumerable一起工作_C#_Asynchronous_Async Await_Task - Fatal编程技术网

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的更多信息,请参见对不同问题的回答