Использование Task.Run для написания асинхронного метода - PullRequest
0 голосов
/ 22 января 2020

Мне просто нужна проверка работоспособности, потому что у меня мало опыта написания асинхронных функций.

Я создаю подкласс абстрактного класса и мне нужно переопределить функцию со следующей сигнатурой:

public abstract Task WriteResponseBodyAsync(OutputFormatterWriteContext context);

Функция должна возвращать задачу, и мое переопределение не использует никаких асинхронных функций, поэтому для возврата Задачи я использую Task.Run. Это правильное использование?

public class FhirJsonFormatter : TextOutputFormatter
{    
    public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
    {
        Hl7.Fhir.Serialization.FhirJsonSerializer ser = new Hl7.Fhir.Serialization.FhirJsonSerializer();

        using (System.IO.StreamWriter sw = new System.IO.StreamWriter(context.HttpContext.Response.Body))
        {
            using (Newtonsoft.Json.JsonWriter jw= new Newtonsoft.Json.JsonTextWriter(sw))
            {
                return Task.Run(() => { ser.Serialize((Hl7.Fhir.Model.Base)context.Object, jw); });
            }
        }
    }
}

1 Ответ

1 голос
/ 22 января 2020

Task.Run запустит код в другом потоке, что, вероятно, не то, что вам нужно.

Почему бы просто не вернуть Task.CompletedTask:

public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
{
    Hl7.Fhir.Serialization.FhirJsonSerializer ser = new Hl7.Fhir.Serialization.FhirJsonSerializer();

    using (System.IO.StreamWriter sw = new System.IO.StreamWriter(context.HttpContext.Response.Body))
    {
        using (Newtonsoft.Json.JsonWriter jw= new Newtonsoft.Json.JsonTextWriter(sw))
        {
            ser.Serialize((Hl7.Fhir.Model.Base)context.Object, jw);
        }
    }
    return Task.CompletedTask;
}

Также с вашим примером, метод может вернуться до того, как ser.Serialize закончится, в результате чего jw, sw и, возможно, даже context будут удалены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...