【问题标题】:Use of lock keyword and the new async functionality of C# 5.0使用 lock 关键字和 C# 5.0 的新异步功能
【发布时间】:2011-11-04 21:12:17
【问题描述】:

是否仍然需要在使用异步 (AsyncCtpLibrary.dll) 调用的方法中对 SQL Compact 数据库等资源使用 lock 关键字?正如我从 Anders 的演讲中了解到的那样,异步处理都发生在同一个线程中,所以它们不应该是必需的,还是我错了?目前我在互联网上的任何地方都找不到这方面的任何信息。

谢谢

【问题讨论】:

  • 如果异步线程的多个实例可能发生,我想这将是必需的。否则理论上您可以尝试更新相同的行/列,最终结果将是竞争条件。有人可能会争辩说,您只是在使用异步方法之前使用了锁。
  • 我对 SQL Compact 数据库一无所知,但我认为这与运行任何线程的正确性无关。如果以前需要一个互斥锁来安全地重入,那么它现在可能需要一个互斥锁来安全地重入,无论是一个线程还是多个线程都在进行重新进入。
  • 我所说的异步线程的多个实例的意思是在短时间内多次执行相同和/或相似的查询。我还应该补充一下,目前还没有 C# 5.0。 Dev Preview 中有 C# 4.5,ASYNC CTP 将成为未来 C# 修订版的一部分。

标签: c# async-ctp c#-5.0


【解决方案1】:

AFAIK 异步基于 TPL 和 Tasks - 所以不,它们不会每次都在同一个线程上运行(或继续在同一个线程上),是的,你必须在设计时仍然考虑到并发性。异步只会帮助您以更好的方式将各个部分组合在一起。

明确一点:方法中的所有内容(如果只启动一次)一次将在一个线程中运行,但如果您共享资源,您将不得不考虑锁定或其他同步方法,就像您过去一直在做的那样.

如果您可以使用不可变数据 - 这样您可以将所有这些都剥离到最低限度,但您始终必须记住您的进程将在多个线程上运行(想到 UI 调度)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 2021-12-18
    • 1970-01-01
    • 2018-12-20
    相关资源
    最近更新 更多