在继续编译其他代码段之前,如何等待信号

时间:2010-10-12 12:34:11

标签: c# .net silverlight mutex

我可以等待来自事件的信号,这样当我收到信号时,我才会继续下一个代码段吗?

为了说清楚,我有以下代码:

hiddenMediaElement.Source = new Uri(strMediaFileName, UriKind.RelativeOrAbsolute);
hiddenMediaElement.MediaFailed += (obj, Sender) =>
{ 
    bMediaError = true; 
};

if (!bMediaError)
{
    ObjChildMediaPlayer.Visibility = Visibility.Visible;
    ObjChildMediaPlayer._currenTitle = strTitle;
    ObjChildMediaPlayer.Show();
    Content_FullScreenChanged(null, null);
}

这里的问题是if条件在MediaFailed事件之前执行。但我想等待MediaFailed事件先执行,然后等待if条件,我不想在这里使用事件。

我怎么能等待呢?我可以使用互斥或​​类似的东西吗?

2 个答案:

答案 0 :(得分:0)

您可以使用AutoResetEvent来处理这种情况。但如果有的话,我肯定会尝试找另一种方式。

var autoResetEvent = new AutoResetEvent(false);

hiddenMediaElement.Source = new Uri(strMediaFileName,UriKind.RelativeOrAbsolute);                         hiddenMediaElement.MediaFailed + =(obj,Sender)=>                             {                                 bMediaError = true;                 autoResetEvent.Set();                             };             hiddenMediaElement.MediaOpened + =(obj,Sender)=>                             {
                //我认为这是在成功时发生的。否则将它放在处理成功的处理程序中                 autoResetEvent.Set();                             };

        autoResetEvent.WaitOne(); // set a timeout value
                    if (!bMediaError)
                    {
                        ObjChildMediaPlayer.Visibility = Visibility.Visible;
                        ObjChildMediaPlayer._currenTitle = strTitle;
                        ObjChildMediaPlayer.Show();
                        Content_FullScreenChanged(null, null);
                    }

或者......我不确定这会有效,但要试一试。

hiddenMediaElement.Source = new Uri(strMediaFileName, UriKind.RelativeOrAbsolute);
        hiddenMediaElement.MediaOpened += (obj, sender) =>
                        {  
            ObjChildMediaPlayer.Visibility = Visibility.Visible;
                            ObjChildMediaPlayer._currenTitle = strTitle;
                            ObjChildMediaPlayer.Show();
                            Content_FullScreenChanged(null, null);
                        };

答案 1 :(得分:-1)

将您的代码放在事件处理程序中:

hiddenMediaElement.Source = new Uri(strMediaFileName, UriKind.RelativeOrAbsolute); 
hiddenMediaElement.MediaFailed += (obj, Sender) => 
{  
    ObjChildMediaPlayer.Visibility = Visibility.Visible; 
    ObjChildMediaPlayer._currenTitle = strTitle; 
    ObjChildMediaPlayer.Show(); 
    Content_FullScreenChanged(null, null); 
};