Редактировать См. Заголовок «Проблема» в конце моего вопроса, чтобы взломать этот вопрос.Цепочные задачи в csharp с успехом и обработчиком ошибок
Исходя из nodejs, где мы могли бы связывать обещания, на C# Я вижу Async Tasks, почти сопоставимые. Вот моя попытка.
Edit - Я не могу отметить мои методы звонящего уровня убер как async
в качестве библиотеки на основе длл называет его объект
Caller
public void DoSomething(MyRequest request)
{
Delegate.Job1(request)
.ContinueWith(Delegate.Job2)
.ContinueWith(Fault, TaskContinuationOptions.OnlyOnFaulted)
.ContinueWith(Result);
}
public void Result(Task<MyRequest> task)
{
MyRequest request = task.Result;
Console.Writeline(request.result1 + " " + request.result2);
}
public void Fault(Task<MyRequest> task)
{
MyRequest request = task.Result;
Console.Writeline(request.result);
}
Делегат Объект
public async Task<MyRequest> Job1(MyRequest request)
{
var data = await remoteService.Service1Async();
request.result1 = data;
return request;
}
public async Task<MyRequest> Job2(Task<MyRequest> task)
{
var data = await remoteService.Service2Async();
request.result2 = data;
return request;
}
Проблема:
1) Edit (фиксировано, связанный длл к моему проекту пропускал это связано DLL) Task.Result
(запрос) приходит в нуль в методе Result
, также Status = Faulted
2) Кроме того, это Правильно ли работает ошибка? Я ожидаю, что Fault будет вызываться только тогда, когда исключение происходит в методах делегата, иначе оно должно пропустить.
2-б) Другим вариантом является проверка в рамках функции Result
(удалить Fault
функцию), если Task.status = RanTocompletion
и ветви там успеха или вина
Редактировать после ответа
У меня есть Гоча, что делать, если я не могу сделать мой контроллер асинхронным.
Контроллер
public void ICannotBeAsync()
{
try
{
var r = await caller.DoSomething(request); // though I can use ContinueWith here, ???
}
catch(Exception e)
{
//exception handling
}
}
Caller
public async Task DoSomethingAsync(MyRequest request)
{
request.result1 = await delegateInstance.Job1(request);
request.result2 = await delegateInstance.Job2(request);
Console.Writeline(request.result1 + " " + request.result2);
return result;
}
Edit 2 - на основе VMAtm Edit, пожалуйста, просмотрите опцию OnlyOnFaulted (Fault).
Delegate.Job1(request)
.ContinueWith(_ => Delegate.Job2(request), TaskContinuationOptions.OnlyOnRanToCompletion)
.ContinueWith(() => {request.result = Task.Exception; Fault(request);}, TaskContinuationOptions.OnlyOnFaulted)
.ContinueWith(Result, TaskContinuationOptions.OnlyOnRanToCompletion);
Проблема -
Дал ему испытание, фактический код ниже, ни один из Result
или Fault
становится называется, хотя метод GetCustomersAsync
вернулся успешно. Мое понимание все останавливается на Fault
, потому что оно помечено для запуска только на Fault
, выполнение останавливается там, а обработчик Result
не вызывается.
Customer.GetCustomersAsync(request)
.ContinueWith(_ => { Debug.WriteLine("not executing"); Fault(request); }, TaskContinuationOptions.OnlyOnFaulted)
.ContinueWith(_ => { Debug.WriteLine("not executing either"); Result(request); }, TaskContinuationOptions.OnlyOnRanToCompletion);
Редактировать 3 Опираясь на ответ EVK в.
Task<Request> task = Customer.GetCustomersAsync(request);
task.ContinueWith(_ => Job2Async(request), TaskContinuationOptions.OnlyOnRanToCompletion);
task.ContinueWith(_ => Job3Async(request), TaskContinuationOptions.OnlyOnRanToCompletion);
task.ContinueWith(_ => Result(request), TaskContinuationOptions.OnlyOnRanToCompletion);
task.ContinueWith(t => { request.Result = t.Exception; Fault(request); }, TaskContinuationOptions.OnlyOnFaulted);
Вы бы просто просто ждать каждой задачи, то попробуйте поймать его. Узел JS Promises должен был предотвратить аддон. Async/Await в C# предотвращает обратный ад. Таким образом, нет необходимости передавать через Node Js мышление на C#, поскольку он уже имеет дело с этим сценарием. –
Мне нравится цепочка, которая поставляется с реализацией Task, я буду использовать ее сильно, но просто не могу ее получить прямо сейчас, я не уверен, почему 'Task.Result' приходит как null в моей функции« Результат » , любые исправления? – user2727195
Я бы посоветовал вам следовать более стилю C#, потому что если у вас есть другие разработчики или вы смотрите на документацию для фреймворков, вы/они могут запутаться, потому что у вас есть своего рода сдвиг парадигмы. Кроме того, вы можете столкнуться с проблемами позже, изменив свои реализации при изменении требований. –