首页 新闻 会员 周边 捐助

c#关于await

0
悬赏园豆:100 [已解决问题] 解决于 2020-11-03 10:01

region

public delegate int _task(int aaa, int sm);
public async Task<int> StartTheTask(_task a, int df, int sm)
{
int b = 0;
await Task.Run(() =>
{
b = a(df, sm);
//Thread.CurrentThread.ManagedThreadId;
});
return b;
}

    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            int number = 100;
            int bbb1 = 0;

            //求出余数,再用总数减去余数得出的数除以每条线程需要执行的标识码数
            int qm = number % 100;//取余
            int qz = number - qm;//求整
            int qcs = qz / 100;//求次数
            Console.WriteLine("取余:" + qm);
            Console.WriteLine("求整:" + qz);
            Console.WriteLine("求次数:" + qcs);


            
            Console.WriteLine("开始进入循环"+Thread.CurrentThread.ManagedThreadId);
            
            for (int i = 0; i < qcs; i++)
            {
                
                Console.WriteLine("开始第"+i+"个");
                
                Task<int> bbbb=  StartTheTask(aa1, 100, i * 10);
                bbb1 = bbbb.Result;
                Console.WriteLine("返回值"+ bbb1 + "方法结束" + "线程ID:"+Thread.CurrentThread.ManagedThreadId);
            }
            
            Console.WriteLine("循环末尾" + Thread.CurrentThread.ManagedThreadId);
        }
        catch (Exception)
        {

            throw;
        }


    }
    public int aa1(int df, int sm)
    {
        int b = 5;
        Thread.Sleep(8000);
        //for (int i = 0; i <= df; i++)
        //{
        //    b += i;
        //    //Thread.Sleep(100);
        //}
        return b;
    }

endregion

Long_Xiaotian的主页 Long_Xiaotian | 初学一级 | 园豆:112
提问于:2020-10-15 10:57

建议改进一下排版,支持markdown语法

dudu 4年前
< >
分享
最佳答案
1
  • 百度 async await 死锁问题
  • async await 机制具有 "传染性",即要求async await的方法链上的所有方法都得加上 async await 关键字。否则会在 bbb1 = bbbb.Result; 处发生死锁
  • 解决方法1,满足 “传染性” 写法,private async Task button1_Click(object sender, EventArgs e)
  • 解决方法2,在 await 关键字后面加上 ConfigureAwait(false)
收获园豆:100
gt1987 | 小虾三级 |园豆:1150 | 2020-10-15 14:06

方法2没有用,在哪里加,找不到ConfigureAwait

Long_Xiaotian | 园豆:112 (初学一级) | 2020-10-15 14:12

@Long_Xiaotian:

await Task.Run(() =>
{
b = a(df, sm);
//Thread.CurrentThread.ManagedThreadId;
}).ConfigureAwait(false);
gt1987 | 园豆:1150 (小虾三级) | 2020-10-15 14:18

@gt1987: 有用,但是界面卡死,还有线程是一个结束才启动另一个

Long_Xiaotian | 园豆:112 (初学一级) | 2020-10-15 14:22

@Long_Xiaotian:
1.界面卡死?在哪一块卡死
2.bbb1 = bbbb.Result 这里就是堵塞线程的,如果要实现并行效果,在循环外定义

List<Task<int>> tasks=new List<Task<int>>();
for ...
   tasks.Add(StartTheTask(aa1, 100, i * 10));

Task.WaitAll(tasks.ToArray());

Console 信息打印 放到异步方法体里面去

gt1987 | 园豆:1150 (小虾三级) | 2020-10-15 14:31
其他回答(3)
0

await Task.Run(() =>
{
b = a(df, sm);
//Thread.CurrentThread.ManagedThreadId;
});
这个a方法是下面的那个aa1方法吗

但乱红尘熊 | 园豆:773 (小虾三级) | 2020-10-15 11:19

对的

支持(0) 反对(0) Long_Xiaotian | 园豆:112 (初学一级) | 2020-10-15 11:21
3

卡死的本质原因是因为主线程被挂起了
bbb1 = bbbb.Result; 这里
解决UI线程(主线程)不卡死的问题,就是把这部分内容放到子线程中执行,在需要更新UI时,使用XXXControl.Invoke来递交给主线程处理

蜗牛往前走 | 园豆:389 (菜鸟二级) | 2020-10-15 11:24
0

UI卡死 是因为逻辑跟UI在同一个线程中执行,

通信的搞程序 | 园豆:1757 (小虾三级) | 2020-10-15 17:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册