Пожалуйста, рассмотрите следующий пример кода:
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);
}
}
Обратите внимание на разницу между Test
и TestAsync
. Этот код удовлетворяет всем утверждениям.
Я думаю, что просмотр кода с Reflector скажет мне, почему, но все же это то, чего я не ожидал вообще.
Конечно, изменение AStruct
как класса вместо структуры не приведет к второму утверждению в TestAsync
- как я ожидал бы этого в первую очередь.
Мой вопрос в том, что, помимо использования изменчивых структур с async/await, существует ли элегантный способ заставить их мирно сосуществовать?