Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 包装方法以等待回调_C#_Delegates_Async Await - Fatal编程技术网

C# 包装方法以等待回调

C# 包装方法以等待回调,c#,delegates,async-await,C#,Delegates,Async Await,我有一个客户端代码(ViewModeL),它正在调用一个ConnectedThingService,它正在调用一个CoapService来更新一个“东西”的模式。CoapService上的更新方法返回任务,并具有成功和错误响应的参数 Task<Task> SetModeFrom(DeviceModel Device, CoAPResponseReceivedHandler responseHandler, CoAPErrorHandler errorHandler);``` 这取

我有一个客户端代码(ViewModeL),它正在调用一个
ConnectedThingService
,它正在调用一个
CoapService
来更新一个“东西”的模式。
CoapService
上的更新方法返回任务,并具有成功和错误响应的参数

Task<Task> SetModeFrom(DeviceModel Device, CoAPResponseReceivedHandler responseHandler, CoAPErrorHandler errorHandler);``` 

这取决于
SetControlModeFromCombo
的工作方式。你能展示一下吗?有一个返回任务并有委托回调的方法是非常奇怪的。“你怎么知道它什么时候完成?”斯蒂芬克利里说,这就是问题所在。代码当前使代理一直返回到ViewModel。我必须在CoAPSharp代码的设计范围内工作。
public async Task<ApiResponse> UpdateModeAsync(int mode)
{
    ApiResponse result = new ApiResponse();
    await _coapService.SetControlModeFromCombo(device, (updateResp) =>
    {
        if (updateResp.Code.Value != CoAPMessageCode.CONTENT)
        {
            result.IsSuccessful = false;
            result.ErrorMessages.Add("Failed setting mode");
        }
        else
        {
            var coapResponse = 
JsonConvert.DeserializeObject<ControlModel>(updateResp.GetPayload());
            result.IsSuccessful = true;
            Mode = mode;
        }
    }, (e, associatedMsg) =>
    {
        result.IsSuccessful = false;
        result.ErrorMessages.Add("Failed setting mode");
    }); 
    return result;
public async Task<Task> SetControlModeFromCombo(DeviceModel Device, 
CoAPResponseReceivedHandler responseHandler, CoAPErrorHandler 
errorHandler)
{
    ushort msgID = Convert.ToUInt16(new Random().Next(1000, 9999));
    var task = new TaskCompletionSource<DeviceModel>();
    if (!string.IsNullOrWhiteSpace(Device.CODE))
    {
        var controlSettings = new ControlModel()
        {
            Mode = Device.ComboSettings.Mode,
        };
        await _coap.MakeRequest(Device.CODE, JsonConvert.SerializeObject(controlSettings.ControlMode()), Device.IPADDRESS, ControlModel.Endpoint, CoAPMessageType.CON, CoAPMessageCode.PUT, msgID, (CoAPResponse response) =>
        {
            responseHandler(response);
            task.SetResult(Device);
        }, (Exception e, AbstractCoAPMessage associatedMsg) =>
        {
            errorHandler(e, associatedMsg);
        });
    }
    else
    {
        ThrowMissingCodeError(task);
    }
    return task.Task;
}
public async Task MakeRequest(string token, string outboundIP, string uri, byte type, byte code, ushort id, CoAPResponseReceivedHandler responseHandler, CoAPErrorHandler errorHandler)
{
    try
    {
        _coapClient = new CoAPClientChannel();
        await _coapClient.Initialize(outboundIP, _outboundPort);
        _coapClient.CoAPResponseReceived += responseHandler;
        _coapClient.CoAPError += errorHandler;
        await _coapClient.Send(AssembleRequest(type, code, id, outboundIP, uri, token), outboundIP);
    }
    catch (Exception e)
    {
        Debug.WriteLine(e);
    }

}