Я немного озадачен и уже часами смотрю / отлаживаю этот код.
В моем сервисе у меня -
var task = Task.Factory.FromAsync(
AnotherService.BeginMethod(arg1, null null),
AnotherService.EndMethod,
TaskCreationOptions.None)
task.ContinueWith((antecedent) =>
{
if (antecedent.isFaulted....)
else // do something else
}
У меня вышеупомянутый код, завернутый вTaskCompletionSource
и установите результат / исключение в методе task.ContinueWith
.Пока все хорошо.
Проблема - поскольку я отлаживаю свои модульные тесты (у меня есть макеты для AnotherService), вызывается начало, я сохраняю переменную и устанавливаю результат в tcs в моем макете.оказание услуг.но мой EndMethod
в MockAnotherService
никогда не вызывается.
Я предполагал, что tcs, возвращенные из сервиса mock, получат сигнал, когда я установлю для него результат / исключение, в результате чего вызов From.Asyn
c вызовет мой метод End.Разве это не так?
РЕДАКТИРОВАТЬ -
Моя ложная реализация -
public IAsyncResult BeginSetDevice(Device device, AsyncCallback callback, object state)
{
var tcs = new TaskCompletionSource<string>(state);
var setTask = Task.Factory.StartNew(
() =>
{
if (this.FaultedState)
{
tcs.SetException(new Exception("You asked for a fault"));
}
else
{
this.DeviceToReturn = device;
tcs.SetResult("success");
}
});
return tcs.Task;
}