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?
2 respostas
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]
Concordo com o Alberto.