如果订阅了IObservable,则控制台应用程序不会正常终止

时间:2018-01-25 14:37:29

标签: c# system.reactive reactiveui

拥有一个控制台应用程序并使用Nito.AsyncEx我有以下入口点。

static int Main(string[] args)
{
    var result = -1;
    try
    {
        result = AsyncContext.Run(() => MainAsync(args));
    }
    catch (Exception ex)
    {
        Console.Error.WriteLine(ex);
    }

#if DEBUG
    Console.WriteLine("Press any key to terminate...");
    Console.ReadKey();
#endif
    return result;
}

我有IDisposable类暴露了IObservable<T>属性。

private readonly Subject<Tuple<IReadOnlyCollection<dynamic>, string>> _onDataResultsSubject = new Subject<Tuple<IReadOnlyCollection<dynamic>, string>>();

public IObservable<Tuple<IReadOnlyCollection<dynamic>, string>> OnDataResults => _onDataResultsSubject;

MainAsync中,我订阅了OnDataResults属性。

using (var processor = new Processor())
{
    var eventDisposable = processor.OnDataResults
        .Select(tuple => Tuple.Create(DataResultsToChunks(tuple.Item1, dataChunkSize), tuple.Item2))
        .Select(tuple => DataChunksToMessageEnvelopes(tuple.Item1, tuple.Item2))
        .SelectMany(messageEnvelope => PublishMessagesAsync(messageEnvelope, messagingService))
        .Subscribe(messagesSent =>
        {
            var result = messagesSent.Select(p => p.ToString())
                .Aggregate((p1, p2) => $"{p1}, {p2}");
            Console.WriteLine($"Message sent {result}");
        },
        ex => Console.Error.WriteLine($"Error: {ex}"));

    await processor.ProcessAsync(migrationConfigs).ConfigureAwait(false);

    eventDisposable.Dispose();
}

当应用程序成功完成并打印Console.WriteLine("Press any key to terminate...");时,按任意键不会终止应用程序。即使在发布模式下,控制台窗口仍保持打开状态并挂起。

删除IDisposable订阅一切正常。

1 个答案:

答案 0 :(得分:0)

问题中展示的代码和@clint捕获的怀疑与.SelectMany(messageEnvelope => PublishMessagesAsync(messageEnvelope, messagingService))有关。 似乎PublishMessagesAsync持有messagingService实例与RabbitMQ的连接。

由于messagingService是我自己的实现,并且实现IDisposable调用Dispose()并在内部清理资源,因此Reactive Extensions将不再保留给实例。

爱RX!总是让你更好地编程: - )