Почему эта простая мобильная форма не закрывается при использовании плеера - PullRequest
2 голосов
/ 23 апреля 2010

Я создал этот простой образец формы с кнопкой закрытия.

Все работает как положено, когда НЕ используется Interop.WMPLib.dll

Я видел другие приложения, использующие это без проблем, но почему процесс Form не закрывается, когда я просто добавляю строку:

SoundPlayer myPlayer = new SoundPlayer();

и, конечно, распоряжаться им:

if (myPlayer != null)
            {
                myPlayer.Dispose();
                myPlayer = null;
            }

Форма закрывается, но отладчик VS2008 все еще активен. Проект Form и dll все еще активны.

Если вы отправите мне электронное письмо по адресу xdasleepsense@gmail.com, я отправлю вам сжатый проект.

Ниже приведен класс для DLL:

с использованием системы; using System.Collections.Generic; используя System.Text; используя System.Threading; using System.Runtime.InteropServices; используя WMPLib;

пространство имен WindowsMobile.Utilities { открытый делегат void SoundPlayerStateChanged (отправитель SoundPlayer, SoundPlayerState newState);

public enum SoundPlayerState
{
    Stopped,
    Playing,
    Paused,
}


public class SoundPlayer : IDisposable
{
    [DllImport("coredll")]
    public extern static int waveOutSetVolume(int hwo, uint dwVolume);

    [DllImport("coredll")]
    public extern static int waveOutGetVolume(int hwo, out uint dwVolume);

    WindowsMediaPlayer myPlayer = new WindowsMediaPlayer();

    public SoundPlayer()
    {
        myPlayer.uiMode = "invisible";
        myPlayer.settings.volume = 100;
    }

    string mySoundLocation = string.Empty;

    public string SoundLocation
    {
        get { return mySoundLocation; }
        set { mySoundLocation = value; }
    }

    public void Pause()
    {
        myPlayer.controls.pause();
    }

    public void PlayLooping()
    {
        Stop();
        myPlayer.URL = mySoundLocation;
        myPlayer.settings.setMode("loop", true);
    }

    public int Volume
    {
        get { return myPlayer.settings.volume; }
        set { myPlayer.settings.volume = value; }
    }

    public void Play()
    {
        Stop();
        myPlayer.URL = mySoundLocation;
        myPlayer.controls.play();
    }

    public void Stop()
    {
        myPlayer.controls.stop();
        myPlayer.close();
    }

    #region IDisposable Members

    public void Dispose()
    {
        try
        {
            Stop();
        }
        catch (Exception)
        {
        }
        // need this otherwise the process won't exit?!
        try
        {
            int ret = Marshal.FinalReleaseComObject(myPlayer);
        }
        catch (Exception)
        {
        }
        myPlayer = null;
        GC.Collect();
    }

    #endregion
}
}

Ответы [ 2 ]

1 голос
/ 24 апреля 2010

MessageBox или Ниже решено. Thx.

public void Dispose()
    {
        try
        {
            Stop();
        }
        catch (Exception)
        {
        }
        // need this otherwise the process won't exit?!
        try
        {
            int ret = Marshal.FinalReleaseComObject(myPlayer);
        }
        catch (Exception)
        {
        }
        myPlayer = null;
        GC.Collect();

        //If you don't do this, it will not quit
        //http://www.eggheadcafe.com/software/aspnet/31363254/media-player-freezing-app.aspx
        for (int s = 0; s < 100; s++)
        {
            Application.DoEvents();
            Thread.Sleep(1);
        }
        GC.WaitForPendingFinalizers();

        //MessageBox.Show("Application Exiting");
    }
0 голосов
/ 24 апреля 2010

Я только что нашел по этой ссылке: http://software.itags.org/pocketpc-developer/163455/ намек ...

Итак, я добавил сообщение:

public void Dispose() 
    { 
        try 
        { 
            Stop(); 
        } 
        catch (Exception) 
        { 
        } 
        // need this otherwise the process won't exit?! 
        try 
        { 
            int ret = Marshal.FinalReleaseComObject(myPlayer); 
        } 
        catch (Exception) 
        { 
        } 
        myPlayer = null; 
        GC.Collect(); 

        **MessageBox.Show("Application Exiting");**

    } 

как только я нажимаю ОК, отладчик также думает, что он закончен. Конечно, я не могу, чтобы пользователь нажимал ОК.

Так что здесь происходит?

...