gpt4 book ai didi

C# 异步等待和异常

转载 作者:行者123 更新时间:2023-11-30 23:16:18 25 4
gpt4 key购买 nike

我编写了一个 visual studio 2015 c# 程序,用于从自定义以太网设备读取一些数据。我需要使用 async await 指令,因为数据将按预定时间一起读取。

我使用自定义 .NET 库读取数据;这是我的代码:

private void timerPollingData_Tick(object sender, EventArgs e)
{
readDevice_01();
readDevice_02();
// and so on for all devices ...
}

private async void readDevice_01()
{
var result = await getDataDevice_01();
// Save data
}

private async void readDevice_02()
{
var result = await getDataDevice_02();
// Save data
}

private Task<string> getDataDevice_01()
{
MyCustomLibrary readDevice = new MyCustomLibrary.Master();
return Task.Factory.StartNew(() => readDevice.ReadHoldingRegister(... some parameters ...).ToString());
}

private Task<string> getDataDevice_02()
{
MyCustomLibrary readDevice = new MyCustomLibrary.Master();
return Task.Factory.StartNew(() => readDevice.ReadHoldingRegister(... some parameters ...).ToString());
}

我的疑问:处理每个任务异常的最佳做法是什么?我需要了解哪些设备从以太网中拔出或关闭然后停止用于从中检索数据的任务。

非常感谢您的帮助。

最佳答案

你应该避免async void;对除异步事件处理程序之外的所有内容使用async Task。有关详细信息,请参阅我关于 async best practices 的文章.

另外,你不应该使用StartNew;这是一个低级的、非常危险的 API,具有不合适的默认参数值。使用 Task.Run 而不是 StartNew。有关详细信息,请参阅我关于 StartNew is dangerous 的博客文章.

I need to use async await instructions because the data will be read all together on scheduled times.

异步是并发的一种形式,您可以将其与Task.Run一起使用 如果您的设备 API 没有异步方法:

private async void timerPollingData_Tick(object sender, EventArgs e)
{
var task1 = readDevice_01();
var task2 = readDevice_02();
// and so on for all devices ...
await Task.WhenAll(task1, task2, ...);
}

private async Task readDevice_01()
{
var result = await Task.Run(() => getDataDevice_01());
// Save data
}

private string getDataDevice_01()
{
MyCustomLibrary readDevice = new MyCustomLibrary.Master();
return readDevice.ReadHoldingRegister(... some parameters ...).ToString();
}

如果您的 API 有一个 ReadHoldingRegisterAsync 方法,那么这将更自然地表示为:

private async void timerPollingData_Tick(object sender, EventArgs e)
{
var task1 = readDevice_01Async();
var task2 = readDevice_02Async();
// and so on for all devices ...
await Task.WhenAll(task1, task2, ...);
}

private async Task readDevice_01Async()
{
var result = await getDataDevice_01Async();
// Save data
}

private async Task<string> getDataDevice_01Async()
{
MyCustomLibrary readDevice = new MyCustomLibrary.Master();
var result = await readDevice.ReadHoldingRegisterAsync(... some parameters ...);
return result.ToString();
}

My doubt: what is the best practice for handle exception of each Task? I need to understand what devices are unplug from Ethernet or switch off and then STOP the TASK used to retrieve data from it.

从任务中获取异常的最佳做法是等待它们。

您不必担心在引发异常后停止任务。当任务报告异常时,它已经停止了。

关于C# 异步等待和异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42065739/

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