Что происходит с TaskCompletionSource
и его Task
если TaskCompletionSource
никогда не завершается (т.е. SetCancelled
, SetException
или SetResult
никогда не называют? Будет ли Task
жить вечно, потому что она никогда не закончится?Должен ли я всегда заполнять объект TaskCompletionSource?
В приведенном ниже примере я упрощенный (MyEevent
не вызывается в течение 1000 мс) TaskCompletionSource
(tcs
) никогда не завершается. У меня есть много таких тестов. tcs.SetCancelled()).?
[Theory]
[InlineData("aa")]
[InlineData(2)]
[InlineData(true)]
[InlineData(null)]
public async Task RaiseMyEvent_RaisesMyEvent_WithOriginalValue(object value)
{
var sut = new Thing();
var tcs = new TaskCompletionSource<object>();
sut.MyEvent += (_, args) => tcs.SetResult(args.Value);
sut.RaiseMyEvent(value);
tcs.Task.Should().BeSameAs(await Task.WhenAny(Task.Delay(1000), tcs.Task), "MyEvent should be raised within 1000ms");
tcs.Task.Result.Should().Be(value);
}
Пока мы находимся у него, есть ли способ улучшить описанный выше тест (например, сделать его еще более кратким/простым/удобочитаемым)?