窗口窗体C#文本框在按下按钮时不显示返回字符串

窗口窗体C#文本框在按下按钮时不显示返回字符串,c#,task,C#,Task,我有一个窗口窗体应用程序,它将在另一个文件(Voice.cs)中执行一个函数,并在按下按钮时在文本框中显示结果。 但是,它不会在我的文本框中显示字符串,并且我的应用程序被冻结。 我能知道这件事带来了什么吗 这是我在form.cs中按下的按钮以执行该功能 private void VoiceStart_Click_2(object sender, EventArgs e) { string command = Voice.RecognizeSpeechAsync().Res

我有一个窗口窗体应用程序,它将在另一个文件(Voice.cs)中执行一个函数,并在按下按钮时在文本框中显示结果。 但是,它不会在我的文本框中显示字符串,并且我的应用程序被冻结。 我能知道这件事带来了什么吗

这是我在form.cs中按下的按钮以执行该功能

private void VoiceStart_Click_2(object sender, EventArgs e)
    {
        string command = Voice.RecognizeSpeechAsync().Result;
        VoiceBox.Text = command;
    }
这是我在Voice.cs中执行语音识别的程序代码:

class Voice
{
    public static async Task<string> RecognizeSpeechAsync()
    {
        var config = SpeechConfig.FromSubscription("xxxxxxxxxxxxxxxxxxxxx", "southeastasia");

        using (var recognizer = new SpeechRecognizer(config))
        {
            var result = await recognizer.RecognizeOnceAsync();
            return result.Text;

        }
    }


}
班级语音
{
公共静态异步任务RecognizeSpeechAsync()
{
var config=SpeechConfig.FromSubscription(“XXXXXXXXXXXXXXXXXX”,“东南亚”);
使用(var识别器=新语音识别器(配置))
{
var result=await recognizer.RecognizeOnceAsync();
返回结果。文本;
}
}
}
我是否需要调整任何东西以使其显示并解冻我的应用程序

不要混合
等待
结果
,使
语音开始_单击_2
异步:

//Side note: async void is a bad idea except event handlers
private async void VoiceStart_Click_2(object sender, EventArgs e)
{
    string command = await Voice.RecognizeSpeechAsync();
    VoiceBox.Text = command;
}

调用
Voice.RecognizeSpeechAsync().Result时正在阻止UI线程-尝试将其更改为
VoiceBox.Text=wait Voice.RecognizeSpeechAsync()
(并将VoiceStart\u Click\u 2()返回类型更改为
async void
-必须为void,因为它是一个事件处理程序)您可能还应该将
RecognizeSpeechAsync()
方法中的await更改为:
var result=await recognizer.RecognizeOnceAsync().ConfigureAwait(false)
.Result
以及
。等待
停止执行(UI),直到
任务
完成,然后分配
结果
等待
要求编译器实现
。continue
因此UI继续工作,但是当
Task
完成时,其余代码(
string command=..和VoiceBox.Text=command
)将被执行,谢谢!!我有主意了