如何在c语言中正确实现wait-async#
我对C#和 我试图使用C#中的异步和等待函数来处理线程和非阻塞GUI 这就是我到目前为止所做的:如何在c语言中正确实现wait-async#,c#,C#,我对C#和 我试图使用C#中的异步和等待函数来处理线程和非阻塞GUI 这就是我到目前为止所做的: public async Task ReadInfo() { string serial; android.UpdateDeviceList(); if (android.HasConnectedDevices) { serial = android.Co
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()));
}
在按钮1上,单击我有:
private async void Button1_Click(object sender, EventArgs e)
{
await ReadInfo();
}
我不知道为什么它会冻结GUI
问题的解决办法
改变
public async Task ReadInfo()
到
点击按钮1,然后按
Task.Run(() => ReadInfo());
ReadInfo
中的任何内容实际上都不是异步的-事实上,编译器应该已经警告您了。如果没有异步未完成的等待,则当前线程(UI线程)上的所有内容都将继续
添加
async
不会使代码在不同的线程上运行。在ReadInfo
中没有任何内容实际上是异步的-事实上,编译器应该已经就此向您发出警告。如果没有异步未完成的等待,则当前线程(UI线程)上的所有内容都将继续
添加
async
不会使代码在不同的线程上运行。使用async
和wait
不会神奇地为您创建新线程。另外,由于ReadInfo
上没有单个wait
,因此整个方法同步运行。我建议您开始使用官方文档:什么是rtbLog
,为什么要使用MethodInvoker
来设置属性?跨线程调用。我建议您进行ReadInfo
public void ReadInfo
并将按钮更改为单击wait Task.Run(()=>ReadInfo())代码>。这应该注意不要冻结GUI并保留代码clean@CamiloTerevinto感谢您让它变得简单明了,这正是我所期望的答案使用async
和wait
不会神奇地为您创建新线程。另外,由于ReadInfo
上没有单个wait
,因此整个方法同步运行。我建议您开始使用官方文档:什么是rtbLog
,为什么要使用MethodInvoker
来设置属性?跨线程调用。我建议您进行ReadInfo
public void ReadInfo
并将按钮更改为单击wait Task.Run(()=>ReadInfo())代码>。这应该注意不要冻结GUI并保留代码clean@CamiloTerevinto谢谢你让我的演讲简短易懂,这正是我作为一名教师所期望的answer@CamiloTerevinto即使是await
也不会显式添加任何线程。在这种情况下,我希望应用同步上下文,因此,await
是对UI线程的回调,在这种情况下如何实现新线程?@AmanAli如果你想使用线程:使用线程-任何thread
,ThreadPool.QueueUserWorkItem
或Task.Run
都应该是很好的候选对象是的,我知道。但令人敬畏的是,人们没有看到该方法将同步运行的警告。我没有看到任何警告。@CamiloTerevinto甚至await
都没有显式添加任何线程。在这种情况下,我希望应用同步上下文,因此,await
是对UI线程的回调,在这种情况下如何实现新线程?@AmanAli如果你想使用线程:使用线程-任何thread
,ThreadPool.QueueUserWorkItem
或Task.Run
都应该是很好的候选对象是的,我知道。但令人敬畏的是,人们没有看到该方法将同步运行的警告。我没有看到任何警告。
Task.Run(() => ReadInfo());