【发布时间】:2021-01-05 01:02:31
【问题描述】:
首先,我的目标是 .Net Core 3.1 和 C#8。
我想要这样的东西。
public static async Task<MyDataObj> GetData()
{
var dataObj = new MyDataObj();
var args = ArgsHelperFunction(...);
await foreach(string result in RunProcessAsync(args))
{
// Process result and store it in dataObj
}
return dataObj;
}
private static async IAsyncEnumerable<string> RunProcessAsync(string args)
{
await using (var myProcess = new Process())
{
myProcess.StartInfo.FileName = @"path\to\file.exe"
myProcess.StartInfo.Arguments = args;
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.RedirectStandardError = true;
myProcess.StartInfo.CreateNoWindow = true;
myProcess.ErrorDataReceived += (s, e) =>
{
yield return e.Data;
}
myProcess.Start();
myProcess.BeginErrorReadLine();
process.WaitforExit();
}
}
当我尝试此设置时,我收到来自 await foreach(string result in RunProcessAsync(args)) 的错误
CS8417 'Process':异步 using 语句中使用的类型必须隐式转换为 'System.IAsyncDisposable' 或实现合适的 'DisposeAsync' 方法。
这个错误来自yield return e.Data;
CS1621 不能在匿名方法或 lambda 表达式中使用 yield 语句
目标是这样的。我有一个执行一些操作并将信息写入错误输出流的 exe(不确定这是否是它的真实名称)。我想在写入时接受这些写入,解析它们以获取我想要的信息并将它们存储在一个对象中以供以后使用。
我是一个相当新手的编码器,对异步编码非常陌生。我以同步方式测试了RunProcessAsync 的功能;它被调用的地方,只是将所有原始数据写入输出窗口,而不将任何数据返回给调用方法。那工作得很好。另外,我得到了一个使用IAsyncEnumerable 的测试异步流,但它只使用了Task.Delay 并返回了一些整数。现在我正在尝试将这些东西结合起来,而我缺乏经验正在阻碍我。
感谢大家提供的任何帮助以及帮助提高 C# 技能和知识。
【问题讨论】:
-
第一个错误很清楚:不能将
await using与Process 一起使用
标签: c# process iasyncenumerable