Исключение XML Serializer не обнаружено в задаче C # - PullRequest
0 голосов
/ 31 октября 2018

Я написал простой сервис для сериализации и десериализации классов с помощью стандартного XmlSerializer. Я хотел сделать это асинхронно, но когда XMlSerializer выдает исключение внутри Задачи, оно не перехватывается try / catch

public async Task<T> DeserializeAsync<T>(TextReader reader)
{
     try
     {
          return await Task.Run(() =>
          {
              var serializer = new XmlSerializer(typeof(T));
              var result = serializer.Deserialize(reader);
              return (T) result;
          });
     }
     catch (Exception e)
     {
          //Do something with exception
     }
}

У меня есть одно решение, но оно не может быть решением этой проблемы:

public async Task<T> DeserializeAsync<T>(TextReader reader)
{

    Exception exception = null;
    var result = await Task.Run(
        () =>
        {
            try
            {
                return (T) new XmlSerializer(typeof(T)).Deserialize(reader);
            }
            catch (Exception e)
            {
                exception = e;
                return default(T);
            }
        });

    if (exception != null)
    {
        // handle exception
    }

    return result;
}

ОБНОВЛЕНИЕ: код, который воспроизводит ошибку:

using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;

public class Program
{
    private static Serializer _serializer;

    static void Main(string[] args)
    {
        _serializer = new Serializer();
        Task.Factory.StartNew(ReadUsers);
        Console.ReadKey();
    }

    private static async Task ReadUsers()
    {
        var stream = new MemoryStream(Encoding.ASCII.GetBytes(""));
        try
        {
             var user = await _serializer.DeserializeAsync<User>(new StreamReader(stream));
            Console.WriteLine(user.Name);
        }
        catch (Exception e)
        {
            Console.WriteLine($"Caught exception: {e.Message}");
        }
    }
}

public class Serializer
{
    public async Task<T> DeserializeAsync<T>(TextReader reader)
        => await Task.Run(() => (T) new XmlSerializer(typeof(T)).Deserialize(reader));
}

public class User
{
    public string Name { get; set; }
    public int Age { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...