相关疑难解决方法(0)

为什么可变结构"邪恶"?

在这里讨论了SO之后,我已经多次读过可变结构是"邪恶"的评论(就像这个问题的答案一样).

C#中可变性和结构的实际问题是什么?

c# struct mutable immutability

470
推荐指数
15
解决办法
7万
查看次数

为什么Enumerator.MoveNext与using和async-await一起使用时不能正常工作?

我想通过a枚举List<int>并调用异步方法.

如果我这样做:

public async Task NotWorking() {
  var list = new List<int> {1, 2, 3};

  using (var enumerator = list.GetEnumerator()) {
    Trace.WriteLine(enumerator.MoveNext());
    Trace.WriteLine(enumerator.Current);

    await Task.Delay(100);
  }
}
Run Code Online (Sandbox Code Playgroud)

结果是:

True
0
Run Code Online (Sandbox Code Playgroud)

但我希望它是:

True
1
Run Code Online (Sandbox Code Playgroud)

如果我删除usingawait Task.Delay(100):

public void Working1() {
  var list = new List<int> {1, 2, 3};

  using (var enumerator = list.GetEnumerator()) {
    Trace.WriteLine(enumerator.MoveNext());
    Trace.WriteLine(enumerator.Current);
  }
}

public async Task Working2() {
  var list = new List<int> {1, 2, 3};

  var enumerator = list.GetEnumerator(); …
Run Code Online (Sandbox Code Playgroud)

c# ienumerable list async-await

22
推荐指数
1
解决办法
1666
查看次数

当涉及到可变值类型时,如何处理async/await产生的副作用?

请考虑以下示例代码:

using System.Diagnostics;
using System.Threading.Tasks;

public struct AStruct
{
    public int Value;

    public async Task SetValueAsync()
    {
        Value = await Task.Run(() => 1);
    }
    public void SetValue()
    {
        Value = 1;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Test(new AStruct());
        TestAsync(new AStruct()).Wait();
    }

    private static async Task TestAsync(AStruct x)
    {
        Debug.Assert(x.Value == 0);
        await x.SetValueAsync();
        Debug.Assert(x.Value == 0);
    }

    private static void Test(AStruct x)
    {
        Debug.Assert(x.Value == 0);
        x.SetValue();
        Debug.Assert(x.Value == 1);
    }
}
Run Code Online (Sandbox Code Playgroud)

注意之间的差异Test和 …

c# struct async-await

12
推荐指数
1
解决办法
437
查看次数

标签 统计

c# ×3

async-await ×2

struct ×2

ienumerable ×1

immutability ×1

list ×1

mutable ×1