进程间事件的多个接收者(. net)



我有例3进程,其中每个进程都可以触发预定义的事件。所有这些进程都应该侦听此事件并只执行一次代码(每个新事件),重置事件并等待它再次触发。因此,对于每个事件,应该运行3个操作。进程不是由一个初始进程启动的。最好的方法是什么?

你可以使用AsyncCallback Delegate。查看一下;

https://msdn.microsoft.com/en-us/library/system.asynccallback (v = vs.110) . aspx


基本上你可以像这样在你的事件中使用:

AsyncCallback finish= new AsyncCallback(EndThis);
Delegate1 delege = new Delegate1(Function1);
delege.BeginInvoke(finish, delege);

,然后写这个方法:

void EndThis(IAsyncResult result)
        {
            if (result.IsCompleted)
            {
                Delegate1 dlg = result.AsyncState as Delegate1;
                dlg.EndInvoke(result);
            }
        }

但我建议你使用线程,它更容易。下面是一个3个进程可以同时触发一个事件的例子。我使用button click event,但你也可以自己使用。

放3个列表视图和2个按钮,你自己试试。我希望这对你有帮助。

using System;
using System.Threading;
using System.Windows.Forms;
namespace AsyncCallbackDelegate
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls = false;
        }
        void Func1()
        {
            for (int i = 0; i < 377885; i++)
            {
                listBox1.Items.Add(i);
                listBox1.SelectedIndex = listBox1.Items.Count - 1;
            }
        }
        void Func2()
        {
            for (int i = 0; i < 1000000; i += 3)
            {
                listBox2.Items.Add(i);
                listBox2.SelectedIndex = listBox2.Items.Count - 1;
            }
        }
        void Func3()
        {
            for (int i = 1; i < 50000; i ++)
            {
                listBox3.Items.Add(i);
                listBox3.SelectedIndex = listBox3.Items.Count - 1;
            }
        }
        Thread t1;
        Thread t2;
        Thread t3;
        private void btnStart_Click(object sender, EventArgs e)
        {
            ThreadStart ts1 = new ThreadStart(Func1);
            ThreadStart ts2 = new ThreadStart(Func2);
            ThreadStart ts3 = new ThreadStart(Func3);
            t1 = new Thread(ts1);
            t2 = new Thread(ts2);
            t3 = new Thread(ts3);
            t1.Start();
            t2.Start();
            t3.Start();
        }
        private void btnStop_Click(object sender, EventArgs e)
        {
            t1.Abort();
            t2.Abort();
            t3.Abort();
        }
    }
}

最新更新