如何在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; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |