我是C#的新手 我正在尝试在C#中使用 async 和等待函数来处理线程和非阻塞GUI。
这是我到目前为止所做的:
/etc/bash.bashrc
这是AddLog方法:
public async Task ReadInfo()
{
string serial;
android.UpdateDeviceList();
if (android.HasConnectedDevices)
{
serial = android.ConnectedDevices[0];
device = android.GetConnectedDevice(serial);
string model = device.BuildProp.GetProp("ro.product.model");
string bootloader = device.BuildProp.GetProp("ro.bootloader");
string pda = device.BuildProp.GetProp("ro.build.PDA");
addlog("Model : " , Color.White, true, true);
addlog(model, Color.DodgerBlue, true, false);
addlog("Bootloader : ", Color.White, true, true);
addlog(bootloader, Color.DodgerBlue, true, false);
addlog("PDA Version : ", Color.White, true, true);
addlog(pda, Color.DodgerBlue, true, false);
}
else
{
addlog("ADB device not found.", Color.Red, true, true);
}
}
On Button1_Click我有这个:
public void addlog(string s, Color color, bool isBold, bool newline = false)
{
if (newline)
{
rtbLog.BeginInvoke(new MethodInvoker(() => rtbLog.AppendText("\r\n")));
}
Color selectionColor = color;
rtbLog.BeginInvoke(new MethodInvoker(() => rtbLog.SelectionStart = rtbLog.Text.Length));
rtbLog.BeginInvoke(new MethodInvoker(() => selectionColor = rtbLog.SelectionColor));
rtbLog.BeginInvoke(new MethodInvoker(() => rtbLog.SelectionColor = color));
if (isBold)
{
rtbLog.BeginInvoke(new MethodInvoker(() => rtbLog.SelectionFont = new Font(rtbLog.Font, FontStyle.Bold)));
}
rtbLog.BeginInvoke(new MethodInvoker(() => rtbLog.AppendText(s)));
rtbLog.BeginInvoke(new MethodInvoker(() => rtbLog.SelectionColor = selectionColor));
rtbLog.BeginInvoke(new MethodInvoker(() => rtbLog.SelectionFont = new Font(rtbLog.Font, FontStyle.Regular)));
rtbLog.BeginInvoke(new MethodInvoker(() => rtbLog.ScrollToCaret()));
}
我不知道为什么会冻结GUI。
问题的解决方案
更改
private async void Button1_Click(object sender, EventArgs e)
{
await ReadInfo();
}
到
public async Task ReadInfo()
并将button1_click调用为
public void ReadInfo()
答案 0 :(得分:4)
ReadInfo
中的任何内容实际上都不是异步的 - 事实上,编译器应该已经警告过你了。如果没有异步不完整等待,则当前线程(UI线程)上的所有内容都会继续。
添加async
不使代码在不同的线程上运行。