我应该如何在async/await操作中使用静态方法/类?

Pat*_*ley 29 c# asynchronous async-await

我的方法是不在异步操作中使用静态方法和类 - 除非实现一些锁定技术来防止竞争条件.

现在async/await已经引入到c#4.5+框架中 - 这简化了多线程应用程序并鼓励响应式UI.

但是 - 因为锁不能/不应该放在等待方法上(我不是在辩论)现在是否会使静态方法利用async/await完全冗余?

Jon*_*eet 49

我的方法是不在异步操作中使用静态方法和类 - 除非实现一些锁定技术来防止竞争条件.

为什么?除非您实际使用共享状态,否则不应存在任何竞争条件.例如,考虑:

public static async Task<int> GetPageLength(string url)
{
    string text = await new WebClient().DownloadStringTaskAsync(url);
    return text.Length;
}
Run Code Online (Sandbox Code Playgroud)

如果您确实有共享状态 - 或者如果您在多个线程使用的实例上使用实例方法 - 则需要确定理想情况下您希望异步操作如何工作.一旦你决定了各种种族应该如何表现,实际上实现它可能相当简单.

  • @PatrickMcCurley:不,绝对没有.两个静态方法调用完全是分开的.(假设两个局部变量实际上不*获取对相同对象的引用,例如通过单例) (10认同)
  • @PatrickMcCurley:请注意,对于非静态方法也是如此-局部变量对于单独的调用是独立的。否则,特别是递归调用将非常困难! (3认同)
  • @PatrickMcCurley:在这种情况下,问题的根本不在于"静态" - 它是"多个线程想要使用相同的共享状态".当实例在各州共享时,实例成员可以很容易地发生这种情况. (2认同)
  • 实际上,考虑到您的原始答案后,我开始怀疑我对调用静态方法时会发生什么的理解。如果在静态方法中声明了局部变量,并且有2个线程同时进入该静态方法-会不会导致本地声明的对象的竞争条件? (2认同)