2015-07-02 181 views
1

我在写第一个简单命令响应样式通信的TAP异步实现方面做了第一次尝试。协议栈。如何将任务<Tuple<E,R>>转换为任务<E>

基准同步实现,提供了几个公用方法

public E SendCommand(C command); 
public E SendCommandAndRetrieveResponse(C command, out R response); 

(其中E是某些形式的错误代码类型的),这两个调用普通内部

E _SendCommandAndRetrieveResponse(C command, out R response); 

传递一个虚设响应SendCommand()的情况。

所以我认为的相当于异步方法签名会

public Task<E> SendCommandAsync(C command); 
public Task<Tuple<E, R>> SendCommandAndRetrieveResponseAsync(C command); 

到目前为止好,但什么让我难倒是,如果我跟着同步模型,并使用一个共同的私人

Task<Tuple<E, R>> _SendCommandAndRetrieveResponseAsync(C command); 

我怎么转换/代理任务<元组< E,R > >由私营方法返回到一个任务<Ë>为b SendCommandAsync()的效益?

thx

Richard。

+0

你的目标是.NET 4.5吗? – Cyral

回答

3

只是使它异步。

public async Task<E> SendCommandAsync(C command) 
{ 
    var result = await _SendCommandAndRetrieveResponseAsync(command); 
    return result.Item1; 
} 
1

由于Tuple有两个值,所以可以简单地从公共私有返回第一个值,即E。该值可用作Task.FromResult的结果,该值将根据该值创建完成的任务。

public Task<E> SendCommandAsync(C command) 
{ 
    return Task.FromResult(_SendCommandAndRetrieveResponseAsync(command).Result.Item1); 
} 

注:该解决方案使用.NET 4.5的功能,请参阅替代解决方案,而不是FromResultthis问题。

+0

这会工作吗?你要返回的值是'E',而不是'Task '在那种情况下不是吗? –

+0

@JohnathonSullinger你的权利,我将不得不作出榜样,并尝试解决这个问题。 – Cyral

+0

这比我的解决方案更优雅哈哈。 –

0

您可以使用ContinueWith调用将持有元组的任务转换为仅持有E的任务。这具有创建嵌套任务Task<Task<E>>的副作用,可以通过展开它们来解决。

private Task<Tuple<E, R>> _SendCommandAndRetrieveResponseAsync(C command) 
{ 
    Task<Tuple<E, R>> result = //..... 

    return result; 
} 

public Task<E> SendCommandAsync(C command) 
{ 
    return _SendCommandAndRetrieveResponseAsync(command) 
     .ContinueWith(task => new TaskCompletionSource<E>(task.Result.Item1).Task) 
     .Unwrap(); 
} 
+0

我*认为*这是我以后,但不会让我的代码在一个状态,以便能够尝试一段时间了。一旦我看到它的工作,将回来投票。谢谢 –

相关问题