You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 20:20:34