我有一个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方法生成字符串并将其排队并返回轮询。
答案 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();
}
}
}