我刚刚在结构中使用异步方法遇到了一个奇怪的行为.有人可以解释为什么会这样,最重要的是如果有解决方法吗?这是一个简单的测试结构,仅仅是为了演示问题
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;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,让我们使用该结构并执行以下调用
var sInstance = new Structure(25);
sInstance.Change(35);
await sInstance.ChangeAsync(45);
Run Code Online (Sandbox Code Playgroud)
第一行实例化结构,sInstance._Value值为25.第二行更新sInstance._Value值,它变为35.现在第三行没有做任何事情,但我希望它能更新sInstance._Value值45而不是sInstance._Value停留35.为什么?有没有办法为结构编写异步方法并更改结构字段的值?
当您在Visual Studio调试器中打开"抛出异常时断开"功能时,它会在选定的异常类型的任何位置中断.告诉它不要破解特定方法的方法是用DebuggerStepThrough属性(或DebuggerHidden)来装饰这些方法.
这,显然,没有一个工作async由于某种原因的方法.这是一个重现问题的片段.调试器将打破内TestAsync,即使它标明的属性,它会不会打破里面Test的除外(它们之间唯一的区别是第一个标有async关键字):
public class Attributes
{
public async Task Run()
{
await TestAsync();
await Test();
}
[DebuggerHidden]
[DebuggerStepThrough]
public async Task TestAsync()
{
try
{
throw new Exception("Async");
}
catch
{
}
await Task.Delay(100);
}
[DebuggerHidden]
[DebuggerStepThrough]
public Task Test()
{
try
{
throw new Exception("sync");
}
catch
{
}
return Task.Delay(100);
}
}
Run Code Online (Sandbox Code Playgroud)
那么,这种行为是有意的吗?这是一个错误吗?有解决方法吗?