2

В моем приложении Windows Phone 8.1 мне нужно создать новый Dispatcher для Thread. Как правило, мы можем сделать это следующим образом:Создать диспетчер

Dispatcher dispatcher = null; 

ManualResetEvent dispatcherReadyEvent = new ManualResetEvent(false); 

new Thread(new ThreadStart(() => 
{ 
    dispatcher = Dispatcher.CurrentDispatcher; 
    dispatcherReadyEvent.Set(); 
    Dispatcher.Run(); 
})).Start(); 

dispatcherReadyEvent.WaitOne(); 

dispatcher.Invoke(...); 

Проблема заключается в том, что с помощью Windows Phone 8.1, я не доступ к Thread класса. Я не понимаю, как я могу создать Thread и извлечь из него Диспетчер. Заранее спасибо.

+0

'Dispatcher.CurrentDispatcher' одинакова для всех ваших App – VMAtm

+0

Да, но я не хочу диспетчеру текущего потока (возможно, UI нить) , Я хочу создать другой поток и использовать его диспетчер. Спасибо за помощь мне. – superpuccio

+2

Не могли бы вы описать, что вы пытаетесь выполнить? «Диспетчер» должен использоваться для доступа к потоку пользовательского интерфейса, из которого обычно будет только один. – WiredPrairie

ответ

1

В определенный момент я хочу остановить параллелизм, и я хочу, чтобы сделать звонки последовательный (после их заказа). Я хотел бы создать своего рода канал. Для этого мне нужен поток, возможно, ChannelThread. Если бы у меня был диспетчер этого потока, я мог бы просто вызвать функции этого диспетчера. Поэтому я буду уверен, что вызовы будут происходить последовательно.

Во-первых, прекратите думать в терминах потоков. На этом этапе разработки программного обеспечения потоки являются деталями реализации. Я рекомендую принять решение самого высокого уровня.

Два момента, которые сразу приходят на ум, - это реактивные расширения (Rx) и поток данных TPL. Поскольку в вашем вопросе не так много контекста, трудно сказать, насколько легко Rx будет интегрироваться с вашим решением. TPL Dataflow обеспечивает простой буфер FIFO, который можно использовать, как это:

var fifo = new ActionBlock<Action>(action => action()); 

По умолчанию потока данных блоки выполняются на пуле потоков и ограничить их параллельности к одному-на-времени, так что это все, что вам нужно.

Для очереди работы к блоку:

fifo.Post(() => { /* work */ }); 
0

Нет, вы не можете получить диспетчера рабочих потоков в приложении Windows Runtime. В .NET for Desktop существует класс Dispatcher, который используется для управления очередью рабочих элементов для потока. Но в Windows Runtime только поток пользовательского интерфейса имеет диспетчер с именем CoreDispatcher.

Чтобы отправить рабочий элемент в фоновый пул потоков. Вы можете использовать метод Windows.System.Threading.ThreadPool.RunAsync.

Using the thread pool in Windows Runtime apps

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

Например:

await RunTask1Async(); 
await RunTask1Async(); 

Или использовать класс Task

var task = new Task(()=> { 
     // work1 
    }).ContinueWith((t)=> { 
     // work2 
    }); 
Смежные вопросы