进程异步导致另一个线程

时间:2011-10-19 16:21:33

标签: c# multithreading asynchronous windows-ce

我有一个WinCE C#应用程序,用于轮询(JAVA)服务器以查找异步传入的消息。我想要实现的是我想要轮询服务器,并在返回结果时将其排队,然后在另一个线程中处理该结果。我想从进程线程中隔离异步接收线程,因为在处理响应之后,我可能不得不向服务器发出额外的POST。

我现在所拥有的是类似于此处所示的类

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

用于向服务器发出异步请求并读取响应。我修改了类以包含自定义超时,但这无关紧要。

我的应用程序中发生的是我在线程'pollingThread'中开始轮询,并从服务器获取响应。如果超时,响应将为null,否则我尝试处理响应。

我想将响应字符串发送给可以处理它的另一个线程,而我的pollingThread返回继续轮询服务器。我无法弄清楚如何将响应转移到另一个线程。我知道如何在大窗口上使用Monitor.Pulse,但不幸的是它在NETCF 3.5上不可用。

任何见解?

由于

编辑:@ Damon8or

我尝试使用AutoReset但由于某种原因,WaitOne()没有意识到其他线程已经Set()事件,因此它错过了通过的数据。这就是我所拥有的:

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 个答案:

答案 0 :(得分:1)

队列类是线程安全的,为什么不使用队列来排队数据?

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

答案 1 :(得分:1)

您可以使用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();
        }
    }
}