Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.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# Task.Factory.FromAsync与";“出去”;端点法中的参数_C#_Async Await - Fatal编程技术网

C# Task.Factory.FromAsync与";“出去”;端点法中的参数

C# Task.Factory.FromAsync与";“出去”;端点法中的参数,c#,async-await,C#,Async Await,如何将Task.Factory.fromsync工厂用于通过“out”参数返回多个值的end方法 begin方法具有以下签名: public virtual System.IAsyncResult BeginGetCaseStatus(int CaseOID, int ClientOID, System.AsyncCallback @__Callback, object @__UserData) 结束方法是: public virtual void EndGetCaseStatus(Syste

如何将Task.Factory.fromsync工厂用于通过“out”参数返回多个值的end方法

begin方法具有以下签名:

public virtual System.IAsyncResult BeginGetCaseStatus(int CaseOID, int ClientOID, System.AsyncCallback @__Callback, object @__UserData)
结束方法是:

public virtual void EndGetCaseStatus(System.IAsyncResult @__AsyncResult, out DTGenericCode[] BasicStatus, out DTGenericCode[] ARStatus)
我能告诉你如何使用:

public Task<?> GetCaseStatusAsync(int CaseOID, int ClientOID)
{
    return Task.Factory.FromAsync  (BeginGetCaseStatus(CaseOID, ClientOID, null, null), EndGetCaseStatus(?, ?));
}
公共任务GetCaseStatusAsync(int-CaseOID,int-ClientOID) { 返回Task.Factory.fromsync(BeginGetCaseStatus(CaseOID,ClientOID,null,null),EndGetCaseStatus(?,); }
异步重载不适用于此。最好的选择可能是构建自己的包装器:

public class ResultStatus
{
     public ResultStatus(DTGenericCode[] basicStatus, DTGenericCode[] arStatus)
     {
         this.BasicStatus = basicStatus;
         this.ARStatus = arStatus;
     }
     public DTGenericCode[] BasicStatus { get; private set; }
     public DTGenericCode[] ARStatus { get; private set; }
}

public Task<ResultStatus> GetCaseStatusAsync(int CaseOID, int ClientOID)
{
     var tcs = new TaskCompletionSource<ResultStatus>();
     theClass.BeginGetCaseStatus(CaseOID, ClientOID, iar =>
             {
                 DTGenericCode[] bs;
                 DTGenericCode[] as;
                 theClass.EndGetCaseStatus(iar, out bs, out as);

                 tcs.SetResult(new ResultStatus(bs, as));
             }, null);

     return tcs.Task;
}
公共类结果状态
{
公共结果状态(DTGenericCode[]basicStatus,DTGenericCode[]arStatus)
{
this.BasicStatus=BasicStatus;
this.ARStatus=ARStatus;
}
公共DTGenericCode[]基本状态{get;私有集;}
公共DTGenericCode[]ARStatus{get;private set;}
}
公共任务GetCaseStatusAsync(int CaseOID、int ClientOID)
{
var tcs=new TaskCompletionSource();
类BeginGetCaseStatus(CaseOID、ClientOID、iar=>
{
DTGenericCode[]bs;
DTGenericCode[]as;
类EndGetCaseStatus(iar、out bs、out as);
设置结果(新结果状态(bs,as));
},空);
返回tcs.Task;
}

fromsync()的
endMethod
参数是委托,因此可以使用lambda将
out
-form转换为
-End
方法的正常形式。比如:

private static Task<Tuple<DTGenericCode[], DTGenericCode[]>> GetCaseStatusAsync(
    int CaseOID, int ClientOID)
{
    return Task.Factory.FromAsync(
        BeginGetCaseStatus, ar =>
        {
            DTGenericCode[] basicStatus;
            DTGenericCode[] arStatus;

            EndGetCaseStatus(ar, out basicStatus, out arStatus);

            return Tuple.Create(basicStatus, arStatus);
        },
        CaseOID, ClientOID, null);
}
私有静态任务GetCaseStatusAsync(
int CaseOID,int ClientOID)
{
返回Task.Factory.fromsync(
BeginGetCaseStatus,ar=>
{
DTGenericCode[]基本状态;
DTGenericCode[]arStatus;
EndGetCaseStatus(ar、out basicStatus、out arStatus);
返回Tuple.Create(basicStatus,arStatus);
},
干酪样,ClientOID,空);
}

虽然您可能希望使用自定义类型,而不是不是不是标准APM End***调用的
元组

,因此FromAsync方法将不起作用。问题,如果
类.EndGetCaseStatus
引发异常,是否需要用try-catch将其包装并将异常传递给
tcs.SetException(
?@ScottChamberlain是的,如果有取消的方法,您还应该设置取消标志(
tcs.SetCancelled()
)。不过,这是最简单的包装,可以让人明白这一点。“没有
fromsync
重载可以实现这一点。”不是直接的,但是你可以通过一点努力让它工作(见我的答案)。