DESAFIO: O que esse código faz?

Qual deveria ser o resultado da execução desse código?

using System;
using System.Threading.Tasks;

using static System.Console;
using static System.IO.File;

class Program
{
    static void Main(string[] args)
    {
        Run();
        ReadLine();
    }
    static void Run()
    {
        var task = ComputeFileLengthAsync(null);
        WriteLine("Computing file length");
        WriteLine(task.Result);
        WriteLine("done!");
    }

    static async Task<int> ComputeFileLengthAsync(string fileName)
    {
        WriteLine("Before If");
        if (fileName == null)
        {
            WriteLine("Inside");
            throw new ArgumentNullException(nameof(fileName));
        }
        WriteLine("After");

        using (var fileStream = OpenText(fileName))
        {
            var content = await fileStream.ReadToEndAsync();
            return content.Length;
        }
    }
}

Dica: será impresso “Computing file length” no output.

Você sabe explicar o porquê? Que estratégia de implementação eu poderia seguir se eu quiser ter a exception quando chamar a função?

Compartilhe este insight:

2 respostas

  1. A task retornada pelo método ComputeFileLengthAsync só é iniciada quando você “awaita” ela na linha ” WriteLine(await task);” por isso a exceção só ocorre depois de imprimir “Computing file length”.

    Uma forma de ter a exceção ocorrendo ao chamar o método ComputeFileLengthAsync, é retornar parte da execução envelopada em uma task, sendo assim, a parte inicial seria executada logo de cara, assim lançando a exceção e não seria impresso o “Computing file length”.

    Meu codigo ficou assim:

    [csharp]
    using System;
    using System.Threading.Tasks;
    using static System.Console;
    using static System.IO.File;

    namespace ConsoleApp1
    {
    class Program
    {
    private static Task _task;

    static void Main(string[] args)
    {
    Run();
    ReadLine();
    }
    static async void Run()
    {
    _task = ComputeFileLengthAsync(null);
    WriteLine("Computing file length");
    _task.Start();
    WriteLine(await _task);
    WriteLine("done!");
    }

    static Task<int> ComputeFileLengthAsync(string fileName)
    {
    if (fileName == null)
    {
    throw new ArgumentNullException(nameof(fileName));
    }

    return new Task<int>(() =>
    {
    using (var fileStream2 = OpenText(fileName))
    {
    var content2 = fileStream2.ReadToEndAsync().Result;
    return content2.Length;
    }
    });
    }
    }
    }
    [/csharp]

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Elemar Júnior

Sou fundador e CEO da EximiaCo e atuo como tech trusted advisor ajudando diversas empresas a gerar mais resultados através da tecnologia.

Elemar Júnior

Sou fundador e CEO da EximiaCo e atuo como tech trusted advisor ajudando diversas empresas a gerar mais resultados através da tecnologia.

Mais insights para o seu negócio

Veja mais alguns estudos e reflexões que podem gerar alguns insights para o seu negócio:

Publicado originalmente em meu linkedin Se há algo que aprendi, tanto academicamente quanto empiricamente, é que a motivação é intrínseca...
When designing systems that need to scale you always need to remember that [tweet]more computing power does not necessarily mean...
[tweet]Aprenda comigo técnicas de modelagem de bancos de dados de documentos NoSQL e a utilizar o RavenDB[/tweet] – um dos...
Há tempos, venho pensando sobre “mérito”. Superficialmente, quanto dos meus resultados, positivos e negativos, se devem exclusivamente a mim? Descartando...
NOTA DO ELEMAR: Este post foi escrito por Fernando Neiva de Paiva e editado por mim. Já fui cético com...
Há anos eu conheço e aceito a ideia de que devemos buscar melhoria contínua. Sei que é natural e aceitável...
× Precisa de ajuda?