gpt4 book ai didi

c# - 无尽任务的最佳方式

转载 作者:行者123 更新时间:2023-11-30 23:09:12 27 4
gpt4 key购买 nike

我有一个任务outputTask。该任务读取 StreamReader 的输出(使用 StreamReader.ReadLineAsync()),

它只能以这种方式工作:

var outputTask = plinkInstance.StandardOutput.ReadLineAsync().ContinueWith(hasOutputReaded);

Action<Task<string>> hasOutputReaded = null;
hasOutputReaded = (previousTask) =>
{
resetTimer.Invoke();
_outputLines.Add(previousTask.Result);
previousTask = plinkInstance.StandardOutput.ReadLineAsync();
previousTask.ContinueWith(hasOutputReaded);
};

它确实有效,但还有其他方法可以让它变得更好吗?

编辑:现在看起来是这样

// ...
Task.Factory.StartNew(() => readUntilEnd(plinkInstance.StandardOutput, timer, cancel.Token), cancel.Token);
// ...

方法

private static void readUntilEnd(StreamReader stream, System.Timers.Timer timer, CancellationToken canelToken)
{
char[] buffer = new char[1];
stream.ReadAsync(buffer, 0, 1);
int cooldown = 0;

while (!canelToken.IsCancellationRequested)
{
if (buffer[0] != '\0')
{
readAChar(buffer[0]);
buffer[0] = '\0';
stream.ReadAsync(buffer, 0, 1);

timer.Stop();
timer.Start();
cooldown = 0;
}
else
{
if (cooldown < 100)
cooldown++;
}

if (cooldown > 0)
Thread.Sleep(cooldown);
}
}

为什么我需要 CancellationToken?我也可以传递一个 bool 对象吗?

最佳答案

既然你正在异步运行你的连续任务,为什么不让它成为一个无限循环呢?

Task.Run(() =>
{
while (true)
{
var output = await READ_LINE_ASYNCHRONOUSLY();
_outputLines.Add(output);
}
});

如果您需要某种方式来跳出循环(我假设您可能会),请使用 CancellationToken,例如这里:

How to cancel a Task in await?

编辑:这是执行您可能想要执行的操作的完整代码:

Task.Run(() => ReadUntilEnd(streamReader, cancellationTokenSource.Token),
cancellationTokenSource.Token);

//...

private static async Task ReadUntilEnd(StreamReader streamReader,
CancellationToken cancellationToken)
{
char[] buffer = new char[1];
while (!cancellationToken.IsCancellationRequested)
{
await streamReader.ReadAsync(buffer, 0, 1);
readAChar(buffer[0]);
}
}

关于c# - 无尽任务的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45959173/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com