异步task的问题

杀马特丶蛮牛 2019-11-26 04:46:51
左边程序可以正常运行,右边一点按钮就假死。是什么原因
...全文
117 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
公西雒 2019-11-27
  • 打赏
  • 举报
回复
按钮里面异步你试试这样的写法:

            Task.Run(async delegate
            {
                await Task.Delay(100); //延迟100毫秒,避免阻塞进程
                try
                {
                    //TODO: 自己的处理逻辑
                }
                catch (Exception exception)
                {
                    //TODO: 异常处理
                }
            });
杀马特丶蛮牛 2019-11-27
  • 打赏
  • 举报
回复
谢谢各位大佬的解答
github_36000833 2019-11-27
  • 打赏
  • 举报
回复
首先,一种解决方法(添加红色部分一行):
private static async Task<int> GetDiceRoll()
{
await Task.Run(() => { }).ConfigureAwait(false);

Console.WriteLine("...Shaking the dice...");
int roll1 = await Roll();
int roll2 = await Roll();
return roll1 + roll2;
}

具体原因,可参考下贴3楼的解释:
关于异步await async [问题点数:50分,结帖人MYsce]
https://bbs.csdn.net/topics/392993599

注:
如果Roll()的实际作用是在UI上显示动画,那么以上的方法并不适用,因为它不能解决“争抢UI死锁”的问题。
显示动画需要使用其它的方式。

  • 打赏
  • 举报
回复
引用 7 楼 杀马特丶蛮牛 的回复:
[quote=引用 5 楼 wanghui0380 的回复:] xxx.result 就已经是同步了,这个不是异步
在winform中直接假死了。。。控制台没问题[/quote]winfrom的wait卡死主线程问题,你搜索一下论坛里面有我回答过的,如果找不到我改天看到你帖子在我的回答里面给你翻翻
Eason0807 2019-11-26
  • 打赏
  • 举报
回复
按钮的时间处理程序加上async,里面过去异步返回值用await修饰
wangmoxhn 2019-11-26
  • 打赏
  • 举报
回复
按钮也用异步,await
杀马特丶蛮牛 2019-11-26
  • 打赏
  • 举报
回复
引用 5 楼 wanghui0380 的回复:
xxx.result 就已经是同步了,这个不是异步
在winform中直接假死了。。。控制台没问题
杀马特丶蛮牛 2019-11-26
  • 打赏
  • 举报
回复
引用 4 楼 wangmoxhn 的回复:
按钮里干嘛不await呢,
现在这个方法是加在构造函数里面的,构造函数不能加async。。。意思是只能再新加个方法吗,方法里await?没有其他方法吗
wanghui0380 2019-11-26
  • 打赏
  • 举报
回复
xxx.result 就已经是同步了,这个不是异步
wangmoxhn 2019-11-26
  • 打赏
  • 举报
回复
按钮里干嘛不await呢,
杀马特丶蛮牛 2019-11-26
  • 打赏
  • 举报
回复
哪位大佬解答下
杀马特丶蛮牛 2019-11-26
  • 打赏
  • 举报
回复
杀马特丶蛮牛 2019-11-26
  • 打赏
  • 举报
回复

private static async Task<int> GetDiceRoll()
        {
            Console.WriteLine("...Shaking the dice...");
            int roll1 = await Roll();
            int roll2 = await Roll();
            return roll1 + roll2;
        }

        private static async Task<int> Roll()
        {
            if (rnd == null)
                rnd = new Random();

            await Task.Delay(500);
            int diceRoll = rnd.Next(1, 7);
            return diceRoll;
        }

111,097

社区成员

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

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

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