2016-09-22 70 views
3

我从main方法调用:如何在C#中将异步方法与同步方法结合起来?

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

我真正想要做的是Wait直到“欢迎来到尼泊尔”正在在mytextblck发言,然后写“你好”。

我已经去了几个线程和工作,但没有什么可以使它的工作。

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

回答

7

这听起来像你真正想要的是当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; 
    } 
} 
+0

哇谢谢老兄它就像一个魅力... – Learner

+0

会不会'Task.FromResult'比'TaskCompletionSource'好# –

+1

@MrinalKamboj:你究竟如何用它来解决手头的问题?它如何帮助你异步等待事件发生? –