WriteMultipleCoilsAsync异步任务执行报错求助:无法捕获响应
解决WriteMultipleCoilsAsync异步任务的返回值错误及响应捕获问题
运行WriteMultipleCoilsAsync异步任务时,在Task.Run语句处出现错误提示Cannot assign void to an implicitly-typed variable,需要捕获该方法的响应消息。
问题原因分析
- 你的
WriteMultipleCoilsAsync方法返回类型为Task而非Task<WriteMultipleCoilsResponse>,意味着该方法没有返回值,await后无法得到响应对象,赋值给var response自然触发类型错误。 - 底层
PerformWriteRequestAsync方法定义为Task,但内部调用的UnicastMessage<T>实际会返回具体的响应对象T,返回类型不匹配导致上层无法获取返回值。
修正方案
1. 修正PerformWriteRequestAsync的返回类型
将返回值从Task改为Task<T>,匹配内部方法的返回值类型:
private Task<T> PerformWriteRequestAsync<T>(IModbusMessage request) where T : IModbusMessage, new() { return Task.Factory.StartNew(() => base.Transport.UnicastMessage<T>(request)); }
2. 修正WriteMultipleCoilsAsync的返回类型
让两个重载方法都返回Task<WriteMultipleCoilsResponse>,使上层能获取响应对象:
public Task<WriteMultipleCoilsResponse> WriteMultipleCoilsAsync(ushort startAddress, bool[] data) { return WriteMultipleCoilsAsync(0, startAddress, data); } public Task<WriteMultipleCoilsResponse> WriteMultipleCoilsAsync(byte slaveAddress, ushort startAddress, bool[] data) { ValidateData("data", data, 1968); WriteMultipleCoilsRequest request = new WriteMultipleCoilsRequest(slaveAddress, startAddress, new DiscreteCollection(data)); return PerformWriteRequestAsync<WriteMultipleCoilsResponse>(request); }
3. 修正按钮点击事件代码
异步方法无需用Task.Run包裹,直接await即可获取响应:
private async void btnWriteMultipleCoils_Click(object? sender, EventArgs e) { string discretes = "true,false,true"; bool[] diarray = Array.ConvertAll(discretes.Split(','), bool.Parse); // 直接await异步方法获取响应 WriteMultipleCoilsResponse response = await master.WriteMultipleCoilsAsync(0, diarray); // 此处可处理响应内容,例如访问response的属性 }
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

