스레드가 이벤트를 기다리고 있는지 확인하는 방법을 궁금합니다.스레드가 이벤트를 기다리고 있는지 확인하는 방법은 무엇입니까?
public delegate void TestHandler(object sender, EventArgs eventArgs);
class Producer
{
public event TestHandler Handler;
public void InvokeHandler(EventArgs eventargs)
{
var handler = Handler;
if (handler != null) handler(this, eventargs);
}
public Producer()
{
Task.Factory.StartNew(() =>
{
while (true)
{
Thread.Sleep((new Random()).Next(0,100));
InvokeHandler(new EventArgs());
} }); } }
그리고 리스너 : 하자 내가 이벤트를 제기 구성 요소를했습니다 말할
class Listener
{
private readonly BlockingCollection<EventArgs> _blockingCollection;
public Listener()
{
var producer = new Producer();
_blockingCollection = new BlockingCollection<EventArgs>(10);
producer.Handler += producer_Handler;
}
void producer_Handler(object sender, EventArgs eventArgs)
{
_blockingCollection.TryAdd(eventArgs); //no error handling for simplicity sake
}
internal void ProcessEvents()
{
while (true)
{
EventArgs eventArgs;
try
{
if (_blockingCollection.TryTake(out eventArgs))
Console.WriteLine("Received event");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
} } } }
나는 그것을 시작한다면 : 나는 (에서 예상 된 동작있어
class Program
{
static void Main(string[] args)
{
var listner = new Listener();
listner.ProcessEvents();
} }
때때로 차단 수집을 통해 이벤트가 발생합니다.
하지만 이 전화를 랩에 걸기 작업 :
Task.Factory.StartNew(() => {
var listner = new Listener();
listner.ProcessEvents(); });
나는 처리 부분에 들어 가지 않을 것입니다. 그 이유는 무엇입니까? 나는 명백한 것을 놓치고 있니?
측면에서 누군가가 여기에서 도움이 될 패턴에 대한 좋은 설명을 알고 있습니까? 하나의 스레드 (주로 기본 응용 프로그램 스레드가 아님)에서 이벤트를 픽업 한 다음 개별 스레드에서 동시에 처리하여 이벤트 수가 너무 많으면 차단합니다 (일반적인 임계 값 가정)
사전에감사합니다,
작업으로 시작했을 때 처리 부분에 도달하지 못했다고 말하면 어떻게됩니까? 프로그램이 단순히 종료 되었습니까? –
#paul, @stic, 내가 물어보고 싶은 것. Errormessages 및 stackdumps하시기 바랍니다. 우리는이 테스트 설정의 유물을 볼 수 있습니다. –
폴, 헨크 - 운동을 몇 번 반복 할 예정이지만, 단지 (사실) 루프를 무시하고 끝내는 깨끗한 실행처럼 보입니다. – stic