我正在试图了解C#5的新异步功能是如何工作的。假设我想开发一个原子增量函数来递增虚构的IntStore中的整数。仅在一个线程中对此函数进行多次调用。
async void IncrementKey(string key) {
int i = await IntStore.Get(key);
IntStore.Set(key, i+1);
}
在我看来,这个功能是有缺陷的。对IncrementKey的两次调用可以从IntStore返回相同的数字(比如说5),然后将它设置为6,从而失去一个增量?
如果IntStore.Get是异步的(返回Task)以便正常工作,那么如何重写呢?
性能至关重要,是否有避免锁定的解决方案?
答案 0 :(得分:4)
如果您确定只从一个线程调用您的函数,那么应该没有任何问题,因为只有一次IntStore.Get
的调用可能正在等待。这是因为:
await IncrementKey("AAA");
await IncrementKey("BBB");
在第一个IncrementKey完成之前,第二个IncrementKey不会被执行。代码将转换为状态机。如果您不信任它,请将IntStore.Get(密钥)更改为:
async Task<int> IntStore(string str) {
Console.WriteLine("Starting IntStore");
await TaskEx.Delay(10000);
return 0;
}
您会看到第二个Starting IntStore
将在第一个{10}后写入。
引用此处http://blogs.msdn.com/b/ericlippert/archive/2010/10/29/asynchronous-programming-in-c-5-0-part-two-whence-await.aspx The “await” operator
... means “if the task we are awaiting has not yet completed then sign up the rest of this method as the continuation of that task, and then return to your caller immediately; the task will invoke the continuation when it completes.”