简体   繁体   中英

How to correctly create a new instance of class A when you gather information about it through events?

I have a:

class A{
int val1, val2, val3}

In the other class I have

 static void eventA(int val1){ //invoked somewhere
  EventManager eventManager1 = new EventManager();
  eventManager1.ServiceResolved += new Events_ServiceResolvedEventHandler(eventB);
 }

 static void eventB(int val2){
  EventManager eventManager1 = new EventManager();
  eventManager1.AddressInfoFound += new Events_AddressFoundEventHandler(eventC);
 }

 static void eventC(int val3){
   //CODE
 }

Those events are only invoke in the order: eventA, eventB, eventC. In the eventA I have access to the val1, in the eventB I have access to the val2 etc. How should I instatize object of class A in this class?


EDIT:

    uusing Bonjour;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace HomeSecurity {
    class Scanner {
        public static DNSSDService service;
        public static DNSSDEventManager eventManager;
        public static DNSSDService browse;

        public static void ScanService() {
            try {
                service = new DNSSDService();
                eventManager = new DNSSDEventManager();
                eventManager.ServiceFound += new _IDNSSDEvents_ServiceFoundEventHandler(eventManager_ServiceFound);
                browse = service.Browse(0, 0, "_axis-video._tcp", null, eventManager);
                //   Application.Run(form = new PumpingForm());
            } catch (Exception e) {

                Console.WriteLine("--------------------EXCEPTION-----------------");
                Console.WriteLine(e);
                Console.WriteLine("--------------------EXCEPTION-----------------");
            }
        }



        static void eventManager_ServiceFound(DNSSDService browser, DNSSDFlags flags, uint ifIndex, string serviceName, string regtype, string domain) {
            try {
                Console.WriteLine("---------------- eventManager_ServiceFound------------------------");
                Console.WriteLine("browser: " + browser + "\nDNSSDFlags " + flags + "\nifIndex " + ifIndex + "\nserviceName: " + serviceName + "\nregtype: " + regtype + "\ndomain: " + domain);
                Console.WriteLine("----------------------------------------");

                //   DNSSDService service2 = new DNSSDService();
                eventManager.ServiceResolved += new _IDNSSDEvents_ServiceResolvedEventHandler(eventManager_ServiceResolved);
                browser.Resolve(flags, ifIndex, serviceName, regtype, domain, eventManager);
            } catch (Exception e) {

                Console.WriteLine("--------------------EXCEPTION--------eventManager_ServiceFound---------");
                Console.WriteLine(e);
                Console.WriteLine("--------------------EXCEPTION-----------------");
            }
        }

        private static void eventManager_ServiceResolved(DNSSDService service, DNSSDFlags flags, uint ifIndex, string fullname, string hostname, ushort port, TXTRecord record) {
            try {
                Console.WriteLine("-------------------eventManager_ServiceResolved---------------------");
                Console.WriteLine("DNSSDService " + service + "\nDNSSDFlags " + flags + "\nifindex " + ifIndex + "\nfullname " + fullname + "hostname " + hostname + "\nport " + port + "\nrecord " + record);
                var str = System.Text.Encoding.Default.GetString(record.GetValueForKey("macaddress"));
                Console.WriteLine("mac " + str);
                Console.WriteLine("----------------------------------------");

                //    DNSSDService service2 = new DNSSDService();
                eventManager.AddressFound += new _IDNSSDEvents_AddressFoundEventHandler(eventManager_AddressFound);
                DNSSDAddressFamily family = new DNSSDAddressFamily();
                service.GetAddrInfo(flags, ifIndex, family, hostname, eventManager);
            } catch (Exception e) {

                Console.WriteLine("--------------------EXCEPTION--------eventManager_ServiceResolved---------");
                Console.WriteLine(e);
                Console.WriteLine("--------------------EXCEPTION-----------------");
            }
        }

        private static void eventManager_AddressFound(DNSSDService service, DNSSDFlags flags, uint ifIndex, string hostname, DNSSDAddressFamily addressFamily, string address, uint ttl) {
            try {
                Console.WriteLine("------------------eventManager_AddressFound----------------------");
                Console.WriteLine("hostname " + hostname);
                Console.WriteLine("address " + address);
                Console.WriteLine("----------------------------------------");
            } catch (Exception e) {

                Console.WriteLine("--------------------EXCEPTION-----eventManager_AddressFound------------");
                Console.WriteLine(e);
                Console.WriteLine("--------------------EXCEPTION-----------------");

            }

        }
    }
}

You could have A with a default constructor, then have 3 functions to initialize val1, val2 and val3. I would then have a 4th function to ensure that all three values are initialized.

Here is rough sample how one can listen to 3 event in sequence and collect data (ie in dictionary) for first several events:

class MyEventListner 
{
    Dictionary<string, string> fields = new Dictionary<string, string>();
    public MyObject Data {get;private set;}

    void HandleEvent1(EventData eventData) { fields["Field1"] = eventData.Field;}
    void HandleEvent2(EventData2 eventData) { fields["Field2"] = eventData.FieldFoo;}
    void HandleEvent3(EventData eventData) { 
       Data  = new MyObject { 
          Field1 = fields["Field1"],
          Field2 = fields["Field2"],
          Filed3 = eventData.Field
    }
}

MyEventListner listener = new MyEventListner ();
WhateverEventManager eventManager = new eventManager();

void Subscribe()
{
    eventManager.OneEvent += d => listener.HandleEvent1(d);
    eventManager.OtherEvent += d => listener.HandleEvent2(d);
    eventManager.LastEvent += d => listener.HandleEvent3(d);
}

after LastEvent fired listener.Data will have filled out data object. One may want to notify someone (ie via another event) that Data is ready.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM