【问题标题】:How to raise cross thread event如何引发跨线程事件
【发布时间】:2011-12-08 15:20:35
【问题描述】:

如何从另一个线程引发事件 GeocodeAddressEventHandler?

    System.Threading.Thread MapThread;
    WinformMap map ;

    public delegate void GeocodeAddressEventHandler(object sender, EventArgs e);
    public event GeocodeAddressEventHandler GeocodeAddressEvent;

    //How to Raise this Event from another thread??
    public void GeocodeAddress_Raised(object sender, EventArgs e)
    {
        MapLib.GeocodeAddress("12798 1ST ST", "", "", "");
    }

    public bool LoadMap(string restorepoint)
    {
        ////////////////////////Engine Controls////////////////////////////////////////////////////////
        try
        {
            System.ServiceModel.OperationContext context = System.ServiceModel.OperationContext.Current;

            //This is to instantiate a winform from a Console (will convert to service shortly) 
            MapThread = new System.Threading.Thread(new System.Threading.ThreadStart(delegate
            {
                using (System.ServiceModel.OperationContextScope scope = new System.ServiceModel.OperationContextScope(context))
                {
this.GeocodeAddressEvent += new GeocodeAddressEventHandler(GeocodeAddress_Raised);
                 }
            }));
            MapThread.SetApartmentState(System.Threading.ApartmentState.STA);
            MapThread.Start();
            MapThread.Join();
        }
        catch (Exception ex)
        {
            return false;
        }

        return true; 
    }

实际上,线程在委托范围终止后终止。这可能是一种愚蠢的方法,但我在该范围内放置了一段时间 Queue.empty { sleep },因此它永远不会终止,然后我从另一个线程启动了 LoadMap,因此它阻塞了我的 WCF 服务等待永无止境的队列终止。

【问题讨论】:

    标签: c# winforms multithreading events


    【解决方案1】:
    【解决方案2】:

    【讨论】:

    • 请注意,Control.Invoke() 仅在您希望 UI 线程执行该方法时才有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多