首先,我的目标是 .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
但以同步方式的功能;它被调用的地方,只是将所有原始数据写入输出窗口,而不将任何数据返回给调用方法。那工作得很好。另外,我得到了一个使用 的测试 asyc 流IAsyncEnumerable
,但它只是使用Task.Delay
并返回了一些整数。现在我正在尝试将这些东西结合起来,而我缺乏经验正在妨碍我。
感谢大家提供的任何帮助以及帮助提高 C# 的技能和知识。