如何使用Task.Factory.FromAsync工厂为通过"out"参数返回多个值的end方法?
begin方法有这个签名:
public virtual System.IAsyncResult BeginGetCaseStatus(int CaseOID, int ClientOID, System.AsyncCallback @__Callback, object @__UserData)
Run Code Online (Sandbox Code Playgroud)
结束方法是:
public virtual void EndGetCaseStatus(System.IAsyncResult @__AsyncResult, out DTGenericCode[] BasicStatus, out DTGenericCode[] ARStatus)
Run Code Online (Sandbox Code Playgroud)
我可以用一些如何使用:
public Task<?> GetCaseStatusAsync(int CaseOID, int ClientOID)
{
return Task.Factory.FromAsync (BeginGetCaseStatus(CaseOID, ClientOID, null, null), EndGetCaseStatus(?, ?));
}
Run Code Online (Sandbox Code Playgroud)
没有任何FromAsync重载可以解决这个问题.最好的选择可能是构建自己的包装器:
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;
}
Run Code Online (Sandbox Code Playgroud)
该endMethod参数FromAsync()是一个委托,所以你可以使用lambda的转换out-型到正常形态-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);
}
Run Code Online (Sandbox Code Playgroud)
虽然您可能想要使用自定义类型而不是Tuple.
| 归档时间: |
|
| 查看次数: |
965 次 |
| 最近记录: |