Есть ли что-то аналогичное Qt :: QueuedConnection в .NET? - PullRequest
1 голос
/ 28 октября 2010

В Qt есть хорошая идиома, чтобы каждый объект был связан с потоком , так что все его обработчики событий будут работать только в этом потоке (если не вызывается напрямую, изкурс).

Есть ли что-нибудь подобное в C # / .NET?Если нет, то как бы вы начали писать свои собственные?

Пример:

// threaded.h
#include <QThread>
#include <QDebug>
#include <QtGlobal>

class ThreadedObject : public QObject {
    Q_OBJECT
public:
    ThreadedObject(const QString &name){
        Name = name;
        // the default QThread implementation is an empty event loop
        Thread = new QThread(this);
        moveToThread(Thread);
        Thread->start();
    }

public slots:
    void tick() {
        qDebug() << Name << "in thread" << (int)QThread::currentThreadId();
    }

private:
    QThread *Thread;
    QString Name;
};

и

// main.cpp
#include <QtCore/QCoreApplication>
#include <QTimer>
#include "threaded.h"


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    ThreadedObject *foo = new ThreadedObject("Foo");
    QTimer footimer;
    QObject::connect(&footimer, SIGNAL(timeout()), foo, SLOT(tick()));

    ThreadedObject *bar = new ThreadedObject("Bar");
    QTimer bartimer;
    QObject::connect(&bartimer, SIGNAL(timeout()), bar, SLOT(tick()));

    qDebug() << "Main thread is" << (int)QThread::currentThreadId();

    footimer.start(1300);
    bartimer.start(3240);

    return a.exec();
}

выведет:

Main thread is 3916 
"Foo" in thread 3824 
"Foo" in thread 3824 
"Bar" in thread 3920 
"Foo" in thread 3824 
...

Ответы [ 2 ]

3 голосов
/ 28 октября 2010

Ближайшая аналогия с этим в .NET, вероятно, будет SynchronizationContext .

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

Однако встроенной реализации, которая работает в любом потоке, не существует. Довольно просто написать один, используя BlockingCollection<T> в .NET 4, но он не включен в Framework. Он также несколько отличается тем, что он автоматически не направляет события обратно в этот поток для вас - это скорее строительный блок, обеспечивающий функциональность, необходимую для этого типа операций.

0 голосов
/ 04 декабря 2010

Диспетчер WPF!

using System;
using System.Windows.Threading;
using System.Threading;

namespace dispatchertest
{
    public class Dispatched : DispatcherObject
    {
        readonly object Lock = new object();
        readonly string _name;
        public string Name { get { return _name; } }

        public Dispatched(string name) {
            this._name = name;
        }

        public void tick(object sender, EventArgs e) {
            lock ( Lock ) {
                Console.WriteLine("{0} in thread {1}", Name, Thread.CurrentThread.ManagedThreadId);
            }
        }
    }

    class Program
    {
        static void Main(string[] args) {

            var timer = new DispatcherTimer(DispatcherPriority.Send, Dispatcher.CurrentDispatcher);

            Thread thread1 = new Thread(() => {
                var d2 = Dispatcher.CurrentDispatcher;
                var foo = new Dispatched("Foo");


                var timer1 = new DispatcherTimer(DispatcherPriority.Send, Dispatcher.CurrentDispatcher);
                timer1.Interval = new TimeSpan(0,0,0,0, milliseconds: 809);
                timer1.Tick += foo.tick;


                timer1.Start();
                Dispatcher.Run();
            });

            var bar = new Dispatched("Bar");
            timer.Tick += bar.tick;

            thread1.Start();

            timer.Interval = new TimeSpan(0,0,0,0, milliseconds: 1234);
            timer.Start();
            Dispatcher.Run();
        }
    }
}

Вывод:

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