【问题标题】:Best practice to execute background task in c# [closed]在 C# 中执行后台任务的最佳实践 [关闭]
【发布时间】:2017-03-22 08:40:49
【问题描述】:

我想知道在 c# 中执行后台任务的最佳做法是什么?

例如,在我的应用程序中,我有一个 save() 函数,当我执行这个函数时,我想在后台运行另一个任务 - 在我的例子中,使用谷歌地图地理编码器将地址转换为 lat/lng .

【问题讨论】:

  • 你听说过任务对象吗?
  • google for BackgroundWorker、Task、async/await
  • @PJvG,并行编程与 OP 的问题无关。 OP 希望在不阻塞 UI 的情况下访问外部资源。为此,async-await 是 .NET 中的最佳方法。它不会创建新线程,也不会使用其他内核来处理数据。
  • @PJvG,你可以使用基于任务的异步编程,但在某种程度上会浪费资源/线程。因为“后台”线程什么都不做——只等待响应。这就是为什么async-await 可以被认为是处理外部资源的好方法。
  • 我会使用 Microsoft 的反应式框架 (NuGet System.Reactive)。它比 TPL 或迄今为止提出的任何其他选项强大得多。

标签: c# background-process


【解决方案1】:

我建议您在保存之前收集和/或计算保存所需的所有信息

考虑一下:如果从地址到纬度/经度的转换失败。 Save() 方法是否应该实际保存对象? 我建议您将该逻辑放在 Save() 方法之外的其他位置。

你可以这样做:

// example object
private ObjectToSave PrepareObjectForPersistance()
{
    return new ObjectToSave { LatLng = await ConvertAddressToLatLng(address) };
}

然后将要保存的对象传递给Save()方法:

public void Save(ObjectToSave obejctToSave)
{
    // Do whatever has to be done to save your object
} 

【讨论】:

    猜你喜欢
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多