将同步代码包装到异步方法中的最佳方法是什么

Ego*_*kas 9 c# asynchronous task-parallel-library

我正在使用async-await方法创建一个应用程序.但是使用它们对我来说存在很大问题.在阅读了一些文章之后,我仍然不知道将重同步操作包装到异步方法的最佳方法是什么.

我有2个想法.哪一个是最好的?

1)目前的实现.

private Task<List<UploadedTestModel>> ParseTestFiles(List<string> filesContent)
{
    var tcs = new TaskCompletionSource<List<UploadedTestModel>>();
    Task.Run(() =>
    {
        var resultList = new List<UploadedTestModel>();
        foreach (var testBody in filesContent)
        {
            try
            {
                var currentCulture = Thread.CurrentThread.CurrentCulture;
                var serializerSettings = new JsonSerializerSettings
                {
                    Culture = currentCulture
                };

                var parsedData = JsonConvert.DeserializeObject<UploadedTestModel>(testBody, serializerSettings);
                resultList.Add(parsedData);
            }
            catch(Exception exception)
            {
                tcs.SetException(exception);
            }
        }
        tcs.SetResult(resultList);
    });
    return tcs.Task;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Task.Run和TaskCompletionSource

2)仅使用Task.Run而不使用TaskCompletionSource

private Task<List<UploadedTestModel>> ParseTestFiles(List<string> filesContent)
{
    return Task.Run(() =>
    {
       . . . .
       return resultList;          
    });
}
Run Code Online (Sandbox Code Playgroud)

Yuv*_*kov 19

我也不会用.对于调用方法调用的人,你会撒谎.当您公开异步操作时,调用者希望它是自然异步的,这意味着它背后没有线程正在工作.

您的所有方法都是继承同步的,您应该将它们公开.将它留给调用者来决定是否要同步调用它们或使用线程并将其排队,不要决定它们.

有一篇很棒的文章称我应该为同步方法公开异步包装器吗?斯蒂芬·图布(Stephan Toub)谈到了不做你想要做的事情的所有理由.我建议阅读它.