gpt4 book ai didi

C#任务等待和超时

转载 作者:太空宇宙 更新时间:2023-11-03 23:02:22 25 4
gpt4 key购买 nike

我正在尝试使用以下技术让工作任务执行一些操作,超时为 10 秒并且不会阻塞应用程序。

internal void ReadAll()
{
var data = new byte[1];

Task.Factory.StartNew(() =>
{
var ct = new CancellationTokenSource();
var ReadAllTask = Task.Factory.StartNew(() =>
{
// Read all information
// [omit communication exchange via COM port]

ct.Cancel();
}, ct.Token);

// First thread waiting 10s for the worker to finish
ReadAllTask.Wait(10000, ct.Token);

if (ReadAllTask.Status == TaskStatus.RanToCompletion)
{
ReadAllComplete?.Invoke(true);
}
else
{
ct.Cancel();
ReadAllComplete?.Invoke(false);
}
});
}

这个方法是通过按下一个按钮来调用的。在我看来,在调试配置中工作正常,但在“第一个线程”永远不会等待并且没有事件被抛出的发布配置中则不行。

最佳答案

您的代码可能比当前版本简单得多。为事件创建非阻塞方法的最简单方法是用 async 关键字标记它并使用 await 关键字启动 asynchronous read operation来自 SerialPort.BaseStream属性(property)。

此外,CancellationTokenSource 可以随时间创建,之后它会自动取消,正确的取消方式是调用 CancellationToken.ThrowIfCancellationRequested方法。 async/await 机制将在 UI 上下文中调用事件,因此代码可能是这样的:

// async void is a recommended way to use asynchronous event handlers
private async void btnReadAll_Click(object sebder, EventArgs e)
{
var data = new byte[2];

// cancel source after 10 seconds
var cts = new CancellationTokenSource(10000);
// Read all information
// [omit communication exchange via COM port]
// async operation with BaseStream
var result = await SerialPort.BaseStream.ReadAsync(data, 0, 2, cts.Token);

/*
* if you can't use the BaseStream methods, simply call this method here
* cts.Token.ThrowIfCancellationRequested();
*/

// this code would run only if everything is ok

// check result here in your own way
var boolFlag = result != null;

ReadAllComplete?.Invoke(boolFlag);
}

关于C#任务等待和超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42652188/

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