gpt4 book ai didi

C# Async Await,重构了一个非常简单的练习程序但是给出了不同的行为

转载 作者:太空宇宙 更新时间:2023-11-03 19:43:23 24 4
gpt4 key购买 nike

我正在尝试学习异步等待。我正在尝试一个只有 1 个文本框和 1 个按钮的简单 C# Windows 窗体应用程序。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

const bool USE_GET_STRING_DIRECTLY = true; // just for switching logic on button1_click

private async void button1_Click(object sender, EventArgs e)
{

textBox1.Clear();
if (USE_GET_STRING_DIRECTLY)
{
// Code #1 <<<---------------------
textBox1.Text += await GetString();
}
else
{
// Code #2 <<<---------------------
var s = await GetString();
textBox1.Text += s;
}
}

async Task<string> GetString()
{
await Task.Delay(2000);
return "Test";
}

}
}

我将 USE_GET_STRING_DIRECTLY 用作一种在代码 #1 和代码 #2 之间切换的条件编译。

如果 USE_GET_STRING_DIRECTLY 为真,代码 #1 将被执行

textBox1.Text += await GetString();

我在 500 毫秒内按了两次按钮。我将在文本框中看到文本 “测试”

现在,我将 USE_GET_STRING_DIRECTLY 设置为 false,将执行代码 #2:

var s = await GetString();
textBox1.Text += s;

我在 500 毫秒内按了两次按钮。我将在文本框中看到文本 "TestTest"。它正在打印两次测试。

在我看来,代码 #1 和 #2 是相同的,但它们表现出不同的行为。不同的是,一个等同于一个变量,而另一个等同于一个Textbox.Text。这可能是什么原因?我对 async/await 还很陌生,所以我很确定我在这里遗漏了一些东西。

最佳答案

所以这里的关键点是 += 运算符的操作数的求值顺序,以及代码中 await 的位置。

+= 运算符的工作方式是确定第一个(左)操作数是什么,在本例中为变量 textBox1.Text,然后它从该变量获取值,然后它计算出第二个(右)操作数是什么,它是 await GetStrings ,具体取决于您使用的是哪个代码段,然后它会合并这两个值,然后将新值设置为变量。

这意味着在第一个代码段中,您将 textBox1.Text 解析为 before 等待 GetString 的值,而在第二个示例中,您解析TextBox1.Text 等待 GetString 后设置为它的值。

综上所述,我不建议在第一个片段上使用第二个片段。避免此问题的正确方法是避免调用 Clear 然后在稍后追加文本。如果你想覆盖现有的文本,而不是附加到它,然后使用 = 而不是 += 来设置文本,因为这将设置它,而不是覆盖它.此外,如果您有一个 UI 事件的异步处理程序,通常在处理程序开始时禁用该 UI 控件是合适的,然后在结束时启用它,如果您不希望用户在较早的处理程序仍在运行时执行该操作(在本例中,按下按钮)。有时您想允许它,但通常(就像这里的情况一样)您不允许。

关于C# Async Await,重构了一个非常简单的练习程序但是给出了不同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49633349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com