Результаты асинхронного процесса в другом потоке - PullRequest
1 голос
/ 19 октября 2011

У меня есть приложение WinCE C #, которое опрашивает сервер (JAVA) на предмет сообщений, поступающих асинхронно.Чего я хочу добиться, так это того, что я хочу опрашивать сервер, а когда возвращается результат, ставить его в очередь и затем обрабатывать этот результат в другом потоке.Я хочу изолировать поток асинхронного приема от потока процесса, потому что после обработки ответа мне, возможно, придется сделать дополнительные POST для сервера.

Сейчас у меня есть класс, похожий на класс, показанный здесь

http://msdn.microsoft.com/en-us/library/86wf6409%28v=vs.80%29.aspx

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

В моем приложении происходит то, что я начинаю опрос в потоке 'pollingThread' и получаю ответ от сервера.В случае тайм-аута ответ будет нулевым, в противном случае я пытаюсь обработать ответ.

Я хочу отправить строку ответа другому потоку, который может обработать ее, в то время как мой pollingThread возвращается к продолжению опроса сервера.Я не могу понять, как получить ответ на другой поток.Я знаю, как это сделать с помощью Monitor.Pulse на больших окнах, но, к сожалению, он недоступен в NETCF 3.5.

Есть идеи?

Спасибо

РЕДАКТИРОВАТЬ: @ Damon8or

Я попытался использовать AutoReset, но по какой-то причине WaitOne () не осознает, что другой поток уже установил событие (), и поэтому пропускает поступающие данные.Вот что у меня есть:

AutoresetEvent _process объявлен статическим и видим для обоих методов

ThreadStart processMethod= new ThreadStart(process);
processingThread= new Thread(processJSONMethod);
processingThread.IsBackground = true;
processingThread.Start();

ThreadStart startMethod = new ThreadStart(Poll);
connectionThread = new Thread(startMethod);
connectionThread.IsBackground = true;                    
connectionThread.Start();

внутри опроса, у меня есть _process.Set() после получения строки изсервер.В методе процесса у меня есть:

while (_keepPolling)
{

_process.WaitOne();

string text= MyQueue.Dequeue();
Debug.WriteLine("Returned: " + text

}    

И я не вижу печатаемой строки отладки.Метод poll создает и ставит в очередь строку и возвращается к опросу.

Ответы [ 2 ]

1 голос
/ 19 октября 2011

Вы можете использовать AutoResetEvent или ManualResetEvent для сигнализации вашего рабочего потока.Вот простой пример того, как.

    using System; 
    using System.Linq; 
    using System.Collections.Generic; 
    using System.Text; 
    using System.Threading; 

    namespace QueueDoodles 
    {
    class Program
    {
        public static readonly string[] data = { "a", "b", "c", "d", "e", "f", "g", "h" };

        static void Main(string[] args)
        {
            var running = true;
            var rand = new Random();
            var q = new Queue<string>();
            var qEvent = new ManualResetEvent(false);
            var pollThread = new Thread(new ThreadStart(delegate()
            {
                while (running)
                {
                    // Queue the next value
                    var value = data[rand.Next(data.Length)];
                    q.Enqueue(value);
                    Console.WriteLine("{0} queued {1}", Thread.CurrentThread.Name, value);

                    // Signal waiting thread
                    qEvent.Set();

                    // Simulate polling
                    Thread.Sleep(rand.Next(100));
                }
            }));
            pollThread.Name = "Poll Thread";

            var workerThread = new Thread(new ThreadStart(delegate()
            {
                while (running)
                {
                    // Wait on the queue
                    if (!qEvent.WaitOne())
                        break;
                    qEvent.Reset();

                    // Process the next queue item
                    var value = q.Dequeue();
                    Console.WriteLine("{0} queued {1}", Thread.CurrentThread.Name, value);
                }
            }));
            workerThread.Name = "Worker Thread";

            // Start the poll thread
            pollThread.Start();

            // Give it some time to fill queue
            Thread.Sleep(1000);

            // Start the worker thread
            workerThread.Start();

            // Wait for keyboard input
            Console.ReadLine();
            running = false;
            qEvent.Set();
        }
    }
}
1 голос
/ 19 октября 2011

Класс очереди является потокобезопасным, почему бы не использовать очередь для постановки ваших данных в очередь?

http://msdn.microsoft.com/en-us/library/system.collections.queue.aspx

...