ramya d nadar Ответов: 1

Исключение прерывания потока происходит случайным образом


Привет,

Я работаю над плагином excel, когда мне нужно показать спиннер, пока какая-то операция не произойдет в фоновом режиме. Я выбрал подход, при котором я поместил изображение spinner(gif) в другую форму windows и вызвал его в отдельном потоке. Как только операция будет завершена, я прерву этот поток, который запускает форму spinner.

Это дает исключение прерывания потока случайным образом.

Что я уже пробовал:

Here is my code:

Spinner form:

<pre>public partial class LoadingScreen : Form
    {
        private LoadingScreen _loadingScreen = null;
        private Thread oThread = null;

        public LoadingScreen()
        {
            InitializeComponent();
        }

        public LoadingScreen(bool showloading)
        {
            InitializeComponent();

            ShowLoadingScreen();
        }
        public void FocusLoading()
        {
            if (_loadingScreen == null)
                ShowLoadingScreen();
            if (oThread != null)
            {
                this.Activate();
            }
        }
        private void ShowFormOpacity()
        {
            _loadingScreen = new LoadingScreen();
            _loadingScreen.Opacity = .75;
            _loadingScreen.Controls["lblLoading"].Visible = false;
            if (_loadingScreen != null)
                Application.Run(_loadingScreen);
        }

        public void CloseFormInstance()
        {
            if (oThread != null)
            {
                try
                {
                    _loadingScreen = null;
                    oThread.Abort();
                    oThread.Join();
                }
                catch (Exception ex) { }
            }
        }
        public void ShowLoadingScreen()
        {
            if (_loadingScreen != null)
                return;
            oThread = new Thread(new ThreadStart(ShowFormOpacity));
            oThread.IsBackground = false;
            oThread.SetApartmentState(ApartmentState.STA);
            oThread.Start();
            while (_loadingScreen == null || _loadingScreen.IsHandleCreated == false)
            {
                System.Threading.Thread.Sleep(50);
            }
        }
    }



Позвонив в форме обтекателя из класса thisaddin.в CS

private LoadingScreen screen;


public void LoadingScreen(bool showloading)
{
    if (screen != null)
    {
        screen.FocusLoading();
    }
    else
    {
        screen = new LoadingScreen(showloading);
    }
}
public void CloseFormInstance()
{
    if (screen != null)
    {
        screen.CloseFormInstance();
    }
}



Почему иногда происходит исключение прерывания потока?

1 Ответов

Рейтинг:
2

Dave Kreskowiak

Ты делаешь это задом наперед. Код, который вы запускаете, находится в потоке пользовательского интерфейса (startup). Все элементы пользовательского интерфейса, включая вашу "форму прядильщика", должны быть в потоке пользовательского интерфейса. Каждое маленькое прикосновение к каждой форме пользовательского интерфейса и элементу управления должно выполняться в потоке пользовательского интерфейса. Создание потока для отображения формы или элемента управления на нем не будет работать.

Это работа, которую вы должны поместить в фоновый поток.