gpt4 book ai didi

c# - 在 C# 中杀死一个任务

转载 作者:行者123 更新时间:2023-12-03 23:20:22 30 4
gpt4 key购买 nike

我在处理生成温度曲线的异步任务时遇到了一些问题。

        public static async Task genLotProfile(string lotno,string filename, string datch)
{
int count = 0;

while (true)
{
count += 1;

//Move this following code to new method
var csv = new StringBuilder();

if (!File.Exists(filename))
{
File.Create(filename);
}


Tprofile temp = getLogData(datch);

if (count == 1)
{
var header = string.Format("Lotno,Temperature,Date,DataChannel");
csv.AppendLine(header);
}


var newLine = string.Format("{0},{1},{2},{3}", lotno,temp.temperature, temp.date, temp.dataChannel);

csv.AppendLine(newLine);

if (!File.Exists(filename))
{
File.WriteAllText(filename, csv.ToString());
}

File.AppendAllText(filename, csv.ToString());

//task delay
await Task.Delay(30000);
}
}
然后我在输入按钮单击功能上以另一种形式调用它。
//Temperature profile
string filename = MainWindow.getTempProfileName(MainWindow.datachannel, lotnoTBX.Text);
MainWindow.genLotProfile(lotnoTBX.Text, filename, MainWindow.datachannel);
在我的情况下,杀死任务的惯例是什么?

最佳答案

Clemens 所说的似乎几乎完全符合您的用例,因为您实际上希望每 30 秒执行一次,然后根据用户请求停止。
不过换个角度回答你的问题,典型的“杀任务”方式是CancellationTokenSource + CancellationToken。 Token 是一个表示“现在死”的标志(开始为 false-ish,可以设置一次为 true-ish 状态,不可清除),而 Source 是标志的 Controller ,允许您提升标志。
请注意,虽然这是“取消任务的标准方式”,但这不是强制停止的方式。任务必须定期检查该 token 并查看它是否被取消。
现在你可能想知道为什么要拥有这样的 Token,为什么不只使用 volatile/atomic/bool/etc。答案是:CancellationToken 是一次性设置的东西,它可以作为值传递,与其他人合并/链接,在设置时订阅以获取回调,它有CancellationToken.ThrowIfCancellation引发异常以快速跳出任何嵌套的 if/switch/while/for 的方法 - 框架可以理解此异常并且是 意向 不被处理并且不会使进程崩溃,并且(...)。
而最重要的是,它得到了人们的认可。如果有人看到 CancellationToken,就会知道它是为了中断/停止/中断某些处理。
每当您想拥有一个 bool要停止某些事情,请改用 CancellationToken。
编辑:我打算写一个例子,但迈克尔兰德尔打败了我:)

关于c# - 在 C# 中杀死一个任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63446317/

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