【发布时间】:2016-09-24 04:57:28
【问题描述】:
我刚刚在结构中使用异步方法时遇到了一个奇怪的行为。有人可以解释为什么会发生这种情况,最重要的是是否有解决方法?这是一个简单的测试结构,只是为了演示问题
public struct Structure
{
private int _Value;
public Structure(int iValue)
{
_Value = iValue;
}
public void Change(int iValue)
{
_Value = iValue;
}
public async Task ChangeAsync(int iValue)
{
await Task.Delay(1);
_Value = iValue;
}
}
现在,让我们使用该结构并执行以下调用
var sInstance = new Structure(25);
sInstance.Change(35);
await sInstance.ChangeAsync(45);
第一行实例化了结构,sInstance._Value 的值为25。第二行更新sInstance._Value 值,变为35。现在第三行没有做任何事情,但我希望它将sInstance._Value 值更新为45 但是sInstance._Value 保持35。为什么?有没有办法为结构编写异步方法并更改结构字段的值?
【问题讨论】:
-
解决方法:不要使用可变结构开始。基本上,我怀疑您的结构被装箱以发生回调,并且突变 is 正在发生,但在该框中。但实际上,不要使用可变结构。这是一个有趣的新(对我而言)关于如何被它们咬伤的变体,但是有很多这样的陷阱。
-
我想指出,在我的情况下,使结构不可变不是一个选项。整个系统很久以前就编码了,我们只需要使用异步方法扩展某些部分。在这一点上重写整个事情看起来并不可行,但我完全理解让结构不可变的概念。有更便宜的解决方法吗?
-
这可能是它的一个变体:stackoverflow.com/questions/29230626/… - 如果是,那么 Microsoft 已经确认枚举器/movenext 问题是编译器中的一个错误,他们在 Roslyn 中修复了这个问题。因此,如果在 Visual Studio 2015 中编译,看看这个问题是否仍然存在将会很有趣。
-
单个内部 mutable 字段 - Microsoft(以及其他)仍然建议它们是类:Choosing between Class and Struct
标签: c# asynchronous struct async-await