gpt4 book ai didi

c# - 将同步或异步方法作为任务使用

转载 作者:行者123 更新时间:2023-11-30 13:48:13 26 4
gpt4 key购买 nike

我在 codeplex 上查看下载管理器类型的项目,偶然发现了这个: http://nthdownload.codeplex.com/

浏览代码时,我遇到了 AddDownloads 等方法,如下所列:

AddDownloads 启动 _downloadQueue.AddDownloads 任务并继续 viewMaintenanceTask 任务。如果您查看这 2 个任务和下游发生的方法和事情,似乎一切都是同步的。

同时阅读这篇博文,Synchronous tasks with Task我试图了解将同步方法包装在 TaskCompletionSource 中的优势(如果有的话)。是因为它为 API 使用者提供了在单独的线程上启动任务的选项,还是仅仅因为您想将该方法作为 Task 使用。包装在 TaskCompletionSource 中的同步方法是否受益于并行处理?

private Task<QueueOperation> AddDownloads(IEnumerable<IDownload> downloads, out Task<QueueOperation> startTask)
{
var addTask = _downloadQueue.AddDownloads(downloads, out startTask);

// Maintain views
var viewMaintenanceTask = addTask.ContinueWith(t =>
{
if (t.Exception == null)
{
var addedDownloads = t.Result.DownloadErrors.Where(k => k.Value == null).Select(k => k.Key).ToList();
var activeDownloads = ActiveDownloads.ToList();
AddToActiveDownloads(addedDownloads.Except(activeDownloads).ToList(), false);
}
else
{
// Rethrow exception, this ensures it'll bubble up to any further ContinueWith chained off this task
throw t.Exception;
}
return t.Result;
});

return viewMaintenanceTask;
}

博文中的示例方法,将同步操作包装在 TaskCompletionSource 中:

var tcs = new TaskCompletionSource<object>();

try
{
object result = model.Deserialize(stream, null, type);
tcs.SetResult(result);
}
catch (Exception ex)
{
tcs.SetException(ex);
}

return tcs.Task;

最佳答案

Does a synchronous method wrapped in a TaskCompletionSource benefit from and parallel processing?

没有。创建 TaskCompletionSource 不会以任何方式、形状或形式创建新线程。

您在底部给出的代码毫无意义 - 当方法返回时任务已经完成(或出错)。如果您必须执行一项任务,它只有才有用。我可能会将其更改为:

try
{
return Task.FromResult(model.Deserialize(stream, null, type));
}
catch (Exception ex)
{
// There's no Task.FromException, unfortunately.
var tcs = new TaskCompletionSource<object>();
tcs.SetException(ex);
return tcs.Task;
}

在 C# 中,它相当于编写一个没有 await 表达式的 async 方法:

public static async Task<object> Deserialize(Model model, Stream stream,
Type type)
{
return model.Deserialize(stream, null, type);
}

如果你想要真正的并行性,你应该使用 Task.Run (.NET 4.5) 或 Task.Factory.StartNew (.NET 4)。

关于c# - 将同步或异步方法作为任务使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13212312/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com