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;
}
async await
死锁问题async await
机制具有 "传染性",即要求async await的方法链上的所有方法都得加上 async await 关键字。否则会在 bbb1 = bbbb.Result;
处发生死锁private async Task button1_Click(object sender, EventArgs e)
ConfigureAwait(false)
方法2没有用,在哪里加,找不到ConfigureAwait
@Long_Xiaotian:
await Task.Run(() =>
{
b = a(df, sm);
//Thread.CurrentThread.ManagedThreadId;
}).ConfigureAwait(false);
@gt1987: 有用,但是界面卡死,还有线程是一个结束才启动另一个
@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 信息打印 放到异步方法体里面去
await Task.Run(() =>
{
b = a(df, sm);
//Thread.CurrentThread.ManagedThreadId;
});
这个a方法是下面的那个aa1方法吗
对的
卡死的本质原因是因为主线程被挂起了
在 bbb1 = bbbb.Result;
这里
解决UI线程(主线程)不卡死的问题,就是把这部分内容放到子线程中执行,在需要更新UI时,使用XXXControl.Invoke来递交给主线程处理
UI卡死 是因为逻辑跟UI在同一个线程中执行,
建议改进一下排版,支持markdown语法
– dudu 4年前