He intentado poner en práctica un productor/consumidor patrón en c#. Tengo un consumidor hilo que controla la cola compartida, y un productor de hilo que coloca los elementos en la cola compartida. El productor hilo está suscrito para recibir datos…es que no tiene un controlador de eventos, y sólo se sienta y espera a que un Controlador de eventos para el fuego (los datos que se envían desde un 3er partido de la api). Cuando se hace de los datos, que se pega en la cola de modo que el consumidor puede manejar.

Cuando el Controlador caso de incendio en el productor, que había esperado a ser manipulados por mi productor hilo. Pero eso no parece ser lo que está pasando. El Controlador de eventos parece como si se maneja en un nuevo hilo en su lugar! ¿Es esta la forma .net siempre funciona…eventos son manejados en su propio hilo? Puedo controlar lo que el hilo va a manejar eventos cuando están planteadas? Lo que si cientos de eventos se producen casi al mismo tiempo…cada uno tiene su propio hilo?

  • Podría ayudar a publicar algo de código, y/o las clases que se están utilizando.
  • Está hablando acerca de los eventos en C# event palabra clave sentido, o eventos en el EventWaitHandle sentido? Creo que se debe publicar algunas código…
  • suena como event, dada su puesto.
InformationsquelleAutor Ben | 2010-03-17

4 Comentarios

  1. 87

    Después de la re-lectura de la pregunta, creo que entiendo el problema ahora. Que, básicamente, ha conseguido algo como esto:

    class Producer
    {
        public Producer(ExternalSource src)
        {
            src.OnData += externalSource_OnData;
        }
    
        private void externalSource_OnData(object sender, ExternalSourceDataEventArgs e)
        {
            //put e.Data onto the queue
        }
    }

    Y luego tienes un consumidor hilo que tira de cosas fuera de la cola. El problema es que el Controlador de eventos es despedido por su ExternalSource objeto – en cualquier hilo que se esté ejecutando en.

    C# events son, básicamente, sólo un fácil-a-uso de la colección de los delegados y de «echar» a un evento sólo hace que el tiempo de ejecución de un bucle a través de todos los delegados y el fuego de una en una.

    Por lo que su Controlador controlador de eventos es recibir llamadas en cualquier hilo de la ExternalSource se está ejecutando.

    • Gracias Codeka,la tienes exactamente. Voy a comprobar en qué hilo de la externalSource eventos que se están produciendo. Agradezco la ayuda.
    • Usted debe marcar esta como el aceptado respuesta. Esto podría ayudar a otros a ver la respuesta más fácilmente.
    • las cosas son diferentes cuando los acontecimientos se disparan con Invocar y BeginInvoke..BeginInvoke invoca el caso el suscriptor en un subproceso diferente de threadpool(en un subproceso en segundo plano)
    • Usted menciona Invocar demasiado. Es Invocar ejecutado en un nuevo hilo?
  2. 23

    A menos que usted haga el cálculo de referencias de ti mismo, un evento que se va a ejecutar en cualquier hilo es invocarlo; no hay nada especial acerca de la forma en que se invocan eventos, y su productor hilo no tiene un controlador de eventos, su productor hilo, simplemente dijo: «hey, cuando el fuego de este evento, llamar a esta función». No hay nada allí que provoca la ejecución del evento que ocurra en la fijación de hilo, ni en su propio hilo (a menos que usted fuera a utilizar BeginInvoke en lugar de invocar el delegado del evento normalmente, pero esto va a ejecutar en el ThreadPool).

  3. 0

    tienes que utilizar autoresetevent controladores para este problema…..en autoresetevent cuando el productor produses se establece a continuación, la señal de consumo de restablecimiento de su señal y consumo.. después de consumir consumir conjunto de la señal, a continuación, sólo productor producido…

    AutoResetEvent pro = new AutoResetEvent(false);
    AutoResetEvent con = new AutoResetEvent(true);
    
    public void produser()
    {
    
        while(true)
        {
            con.WaitOne();
    
            pro.Set();
        }
    }
    
    public void consumer()
    {
        while (true)
        {
        pro.WaitOne();
           .................****
    
        con.Set();
        }
    }
    
    private void button1_Click(object sender, EventArgs e)
    {
        Thread th1 = new Thread(produser);
        th1.Start();
        Thread th2 = new Thread(consumer);
        th2.Start();
    }

Dejar respuesta

Please enter your comment!
Please enter your name here