异步方法里赋值操作不起作用,请教怎么改?

中文命名法 2019-11-21 02:29:19
struct 结构
{
DateTime 时间;
public async void 测试()
{
时间 = new DateTime();
全局.记录日志($"{时间}");
await 更新时间();
全局.记录日志($"{时间}");
}
async Task 更新时间()
{
await Task.Delay(1000);
时间 = DateTime.Now;
}
}
有这样一个使用异步的结构体,实例化之后,运行 测试();结果打印出来的2次时间都是DateTime的初始值,更新时间()里对时间赋值并未起作用。请问我要怎样才能在异步方法里修改“时间”的值?
...全文
324 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
angel6709 2019-11-22
  • 打赏
  • 举报
回复
结构体改成类吧
github_36000833 2019-11-21
  • 打赏
  • 举报
回复
我猜测更大的可能性是,未来的版本将由编译器来报错。 原因是现在闭包处理已经能侦测到类似"错误":
struct 结构
{
  DateTime 时间;
  public void 更新时间二()
  {
    Action 闭包 = () =>
    {
        时间 = DateTime.Now;  // 这里编译器会报错
    };
    闭包();
  }
}
github_36000833 2019-11-21
  • 打赏
  • 举报
回复
引用 楼主 中文命名方式倡导者 的回复:
...请问我要怎样才能在异步方法里修改“时间”的值?
做不了(struct里做不了)。 因为编译器改写await要引入一个状态机,只要是异步返回后需要用到的变量,该状态机都要捕获。 异步返回后要更改struct的成员,该struct就要传入到状态机中,不幸的是,由于struct是值类型,传入到到状态机中的是值的拷贝。我们知道,改变拷贝里的成员,影响不到原本。 这种行为不如人意,不过我猜测以后即使有机会,为了兼容以发行的产品,微软也不会改变这种行为。
中文命名法 2019-11-21
  • 打赏
  • 举报
回复
引用 1 楼 angel6709 的回复:
 struct 结构
    {
        DateTime 时间;
        public async void 测试()
        {
            时间 = new DateTime();
            Console.WriteLine($"{时间}");
            var t =await 更新时间();
            Console.WriteLine($"{t}");
        }
        async Task<DateTime> 更新时间()
        {
            await Task.Delay(1000);
            var t = DateTime.Now;
            return t;
        }
    }
能否在async Task<DateTime> 更新时间()这个功能里,把值写入结构中的时间变量上,因为不是立即使用的,而且必须在这一级的函数上写值。
angel6709 2019-11-21
  • 打赏
  • 举报
回复
 struct 结构
    {
        DateTime 时间;
        public async void 测试()
        {
            时间 = new DateTime();
            Console.WriteLine($"{时间}");
            var t =await 更新时间();
            Console.WriteLine($"{t}");
        }
        async Task<DateTime> 更新时间()
        {
            await Task.Delay(1000);
            var t = DateTime.Now;
            return t;
        }
    }

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧