如何在c语言中正确实现wait-async#

如何在c语言中正确实现wait-async#,c#,C#,我对C#和 我试图使用C#中的异步和等待函数来处理线程和非阻塞GUI 这就是我到目前为止所做的: public async Task ReadInfo() { string serial; android.UpdateDeviceList(); if (android.HasConnectedDevices) { serial = android.Co

我对C#和 我试图使用C#中的异步等待函数来处理线程和非阻塞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()));
        }
在按钮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());