Rx em .net 3.5 não assíncrono?
-
21-09-2019 - |
Pergunta
Estou brincando com RX em .NET3.5SP1 e tentando o 101 amostras RX. Estou tentando a primeira amostra (Iniciar - Executar o código de maneira assíncrona), mas parece que não é realmente executado de forma assíncrona. Por exemplo,
Console.WriteLine("[Creating]");
var o = Observable.Start(() =>
{
Console.WriteLine("Calculating...");
Thread.Sleep(3000);
Console.WriteLine("Done.");
});
Console.WriteLine("[Created]");
Console.WriteLine("[Starting]");
o.First(); // subscribe and wait for completion of background operation
Console.WriteLine("[Started]");
Saídas
[Creating]
[Created]
[Starting]
Calculating...
<...3 Second Wait...>
Done.
[Started]
Há uma explicação para isso? Estou fazendo algo errado? Esse comportamento esperado?
ATUALIZAR
Eu teria pensado que teria dito
[Creating]
[Created]
[Starting]
Calculating...
[Started]
<...3 Second Wait...>
Done.
Mas o encadeamento principal é bloqueado enquanto a chamada supostamente assínculada acontece.
Solução
Isso parece razoavelmente esperado para mim.
Se você colocar um Thread.Sleep
Ligue entre "criado" e "Iniciando", acho que você verá a linha "calculista", mostrando que está funcionando enquanto o thread principal está em execução. É assim que é assíncrono.
Se você está preocupado porque First()
Retorna o valor em si, em vez de dar uma espécie de valor "futuro" que você pode consultar mais tarde, isso é um assunto diferente - e eu tenho duas postagens para você ler: parte 1; parte 2. EU acho você quer o Prune
Método, mas não tenho certeza.
Outras dicas
A linha // subscribe and wait for completion of background operation
diz que aguarda a conclusão da operação em segundo plano. Então você não esperaria o código seguindo essa linha (Console.WriteLine("[Started]");
) para executar até que a operação seja concluída, certo?
Primeiro está bloqueando ... Inscreva -se é o que você deseja:
public static void Main(string[] args) {
Console.WriteLine("[Creating]");
var o = Observable.Start(() =>
{
Console.WriteLine("Calculating...");
Thread.Sleep(3000);
});
Console.WriteLine("[Created]");
Console.WriteLine("[Starting]");
o.Subscribe(_ => Console.WriteLine("Done.")); // subscribe and wait for completion of background operation
Console.WriteLine("[Started]");
Console.ReadKey();
}