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.

Foi útil?

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();
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top