【发布时间】:2018-11-12 16:37:18
【问题描述】:
我是 C# 新手,并且 我正在尝试在 C# 中使用 async 和 await 函数来处理线程和非阻塞 GUI。
这是我目前所拥有的:
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);
}
}
这是 AddLog 方法:
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()));
}
在 Button1_Click 我有这个:
private async void Button1_Click(object sender, EventArgs e)
{
await ReadInfo();
}
我不知道为什么它会冻结 GUI。
解决问题
变化
public async Task ReadInfo()
到
public void ReadInfo()
并以 button1_click 的身份调用
Task.Run(() => ReadInfo());
【问题讨论】:
-
使用
async和await不会神奇地为您创建新线程。此外,由于ReadInfo上没有单个await,因此整个方法同步运行。我建议您开始使用官方文档:docs.microsoft.com/en-us/dotnet/csharp/programming-guide/… -
什么是
rtbLog,你为什么要在BeginInvoke和MethodInvoker上设置属性? -
跨线程调用。
-
我建议您将
ReadInfopublic void ReadInfo并将您的按钮点击更改为await Task.Run(() => ReadInfo());。这应该注意不冻结 GUI 并保持代码干净 -
@CamiloTerevinto 感谢您将其简化为我所期望的答案
标签: c#