Потокобезопасная форма. Шоу - PullRequest
1 голос
/ 24 апреля 2009

Я пишу Toast, который должен быть поточно-ориентированным, поскольку он используется для сообщения о состоянии асинхронного ввода сокетов. Я пытался сделать его потокобезопасным, но тосты по-прежнему запираются.

    public static void Show( string message ) {
        Toast toast = new Toast( message );
        toast.ShowAction();
    }

    private delegate void InvokeCallback();

    public void ShowAction() {
        if ( InvokeRequired ) {
            Invoke( new InvokeCallback( ShowAction ) );
        }
        else {
            Show();
        }
    }

Я хочу, чтобы их можно было легко отображать как окно сообщения, т. Е. Toast.Show("Status changed");. Любая помощь будет принята с благодарностью.

1 Ответ

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

Ваша проблема в том, что Toast СОЗДАН в другом потоке. Скорее всего, вам нужно будет иметь «цель» в главном потоке пользовательского интерфейса, где вы можете Invoke() создать И показать Toast, сохраняя все пользовательские интерфейсы в одном потоке.

EDIT

Если вам нужно сохранить это в другом потоке, вы можете создать еще один поток с циклом сообщений.

Thread t = new Thread();

t.SetApartmentState(ApartmentState.STA) // Required for a UI thread

Что касается реализации задач по отправке и сообщений в эту ветку, я оставлю это на ваше усмотрение. Вам нужно будет позвонить Application.Run() в начале, чтобы начать цикл обработки сообщений.

И, как всегда, вы должны быть уверены, что Invoke() будет выполнять любые операции из вашего тоста (или чего-либо в этом потоке), которые могут взаимодействовать с основным потоком пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...