提问者:小点点

如何在C#[duplication]中正确实现await异步


我是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()));
        }

在按钮1_Click上,我有以下内容:

 private async void Button1_Click(object sender, EventArgs e)
        {
           await  ReadInfo();
        }

我不知道为什么会冻结GUI。

问题的解决办法

正在改变

public async Task ReadInfo()

 public void ReadInfo()

和调用按钮1_Click as

Task.Run(() => ReadInfo());

共1个答案

匿名用户

中没有任何东西实际上是异步的--事实上,编译器应该已经警告您这一点了。如果不存在异步的不完全等待,则所有事情都在当前线程-UI线程上继续。

添加不会使代码在不同的线程上运行。

相关问题