加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在C#中将异步方法与同步方法结合起来?

发布时间:2020-12-15 23:35:29 所属栏目:百科 来源:网络整理
导读:我是从主要方法调用的: public MainPage(){ Text_to_Speech.changetospeech("Welcome to Nepal!",newmedia).Wait(); mytxtblck.Text="Hello from Nepal!"} 我真正想做的是等到“欢迎来到尼泊尔”,然后在mytextblck中写下“Hello”. 我已经去了几个线程并且
我是从主要方法调用的:

public MainPage()
{
  Text_to_Speech.changetospeech("Welcome to Nepal!",newmedia).Wait();
  mytxtblck.Text="Hello from Nepal!"
}

我真正想做的是等到“欢迎来到尼泊尔”,然后在mytextblck中写下“Hello”.

我已经去了几个线程并且工作了,但没有任何东西可以使它工作.

public async static Task changetospeech(string text,MediaElement mediaa)
{
   var synth = new SpeechSynthesizer();
   var voices = SpeechSynthesizer.AllVoices;

   synth.Voice = voices.First(x => x.Gender == VoiceGender.Female );
   SpeechSynthesisStream stream = await synth.SynthesizeTextToStreamAsync(text);

   MediaElement media = mediaa;
   media.SetSource(stream,stream.ContentType);
   media.Play();   
}

解决方法

听起来你真正想要的是在 MediaEnded事件被触发时触发文本更改.

你可以在你的ChangeToSpeech方法中做到这一点,虽然它会有点难看:

public async static Task ChangeToSpeech(string text,MediaElement media)
{
    var synth = new SpeechSynthesizer();
    var voices = SpeechSynthesizer.AllVoices;

    synth.Voice = voices.First(x => x.Gender == VoiceGender.Female);

    SpeechSynthesisStream stream = await synth.SynthesizeTextToStreamAsync(text);

    var tcs = new TaskCompletionSource<int>();
    RoutedEventHandler handler = delegate { tcs.TrySetResult(10); };
    media.MediaEnded += handler;
    try
    {
        media.SetSource(stream,stream.ContentType);
        media.Play();
        // Asynchronously wait for the event to fire
        await tcs.Task;
    }
    finally
    {
        media.MediaEnded -= handler;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读