내가 dollowing의 C# 5 의사에 해당 할 노력하고있어 기다리고 도서관 병렬 -번역 예외 라
async Task<int> CallAndTranslate()
{
try
{
return await client.CallAsync();
} catch(FaultException ex) {
if (ex.FaultCode ...)
throw new Exception("translated");
}
}
Given an arbitrary Task
which does not return a result, translating exceptions는 C# 5 백 포팅 쉽게 using the technique supplied by @Drew Marsh
Task.ContinueWith
의 과부하로이 기술은 보통 Task<T>
으로 일반화되지 않습니다. Task
이 아니라 Task<T>
이 아니라 대머리가 반환됩니다. 관통 던져 잡힐의 음모를 통과 할 수있는 예외를 일으키는 또 다른 Task<T>
- :
에 의존하지 않고 TPL API를 사용하여이를 달성 할 수있는 방법이 있나요 예외 처리 메커니즘 예외가
,691,363를 번역 할 수없는 경우 단독 스택 추적을 떠나야한다 intial 대답 한 후
- ADDED ....이
public class TranslatingExceptions { Task<int> ApiAsync() { return Task<int>.Factory.StartNew(() => { throw new Exception("Argument Null"); }); } public Task<int> WrapsApiAsync() { return ApiAsync().TranslateExceptions(x=>{ if (x.Message == "Argument Null") throw new ArgumentNullException(); }); } [Fact] public void Works() { var exception = Record.Exception(() => WrapsApiAsync().Wait()); Assert.IsType<ArgumentNullException>(exception.InnerException); } }
다음
Task<T>
확장 내 자리 구현 구현 :
210 여기 내 순진 자리 구현의
static class TaskExtensions
{
public static Task<T> TranslateExceptions<T>(this Task<T> task, Action<Exception> translator)
{
// TODO REPLACE NAIVE IMPLEMENTATION HERE
return Task<T>.Factory.StartNew(() =>
{
try
{
return task.Result;
}
catch (AggregateException exception)
{
translator(exception.InnerException);
throw;
}
});
}
}
감사를 사용하여 당신은 단지'을 반환하지 않으므로 여기에 문제가 있습니다. 그러므로 질문을 던지며 (놀랍지 않게도 나위도하지 않습니다). 아마도 ToTaskOf 변환기가 있습니다. 어느 쪽이든, 이것은 제공된 테스트 베드에서 통과하지 않을 것입니다, 미안 해요! (내가 복제하려고하는 비트는 상태 머신이 수행하는 것이 아니라 'Task '저글링입니다.) 작년부터 @ 존 켓 (Jon Skeet)의 뛰어난 'C# 5에서의 비동기식 파괴'시리즈의 내용은 기억이 안납니다. –
ContinueWith<T>
를 사용하려는 경우 드류 마쉬의 코드 단지 약간의 비틀기입니다. 불행하게도 질문에 언급 된 ** Task **'.ContinueWith'는'TaskMSDN은'ContinueWith'의 모든 과부하를 표시하지는 않지만 확실히'Task'을 반환하는 것들이 있습니다. [This one] (http://msdn.microsoft.com/en-us/library/dd321561.aspx)이 가장 비슷하지만 '작업 '을 전제로 사용하는 .NET 4 RTM에도 있습니다. –
수정하십시오.명확하지는 않지만 연속 메서드에서 결과를 반환하면 컴파일러에서 작업의 결과로 적절한 오버로드를 선택합니다. –