如何实现异步..NET中外部使用的已完成事件

本文关键字:外部 事件 已完成 NET 何实现 实现 异步 | 更新日期: 2023-09-27 18:24:07

我有一个简单的项目来获取HTML元素的内部数据。这是一个DLL项目。

 public class WebGrabber
    {
        public string URL { set; get; }
        public string Element { set; get; }
        public bool FindByID { set; get; }
        private WebBrowser b { set; get; }
        private mshtml.IHTMLDocument2 doc { set; get; }
        public void GetPageElementInnerHTML(string url, string element, bool findById)
        {
            URL = url;
            Element = element;
            FindByID = findById;
            b = new WebBrowser();
            b.Navigate(url);
            b.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(b_DocumentCompleted);
        }
        void b_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            doc = (IHTMLDocument2)b.Document.DomDocument;
            string result = "<html>";
            IHTMLElement head = (IHTMLElement)((IHTMLElementCollection)doc.all.tags("head")).item(null, 0);
            result += "<head>" + head.innerHTML + "</head>";
            if (null != doc)
            {
                foreach (IHTMLElement element in doc.all)
                {
                    if (element is mshtml.IHTMLDivElement)
                    {
                        dynamic div = element as HTMLDivElement;   
                        if (FindByID)
                        {
                            string id = div.id;
                            if (id == Element)
                            {
                                result += "<body>" + div.IHTMLElement_innerHTML + "</body></html>";
                                break;
                            }
                        }
                        else
                        {
                            string className = div.className;
                            if (className == Element)
                            {
                                result += "<body>" + div.IHTMLElement_innerHTML + "</body></html>";
                                break;
                            }
                        }
                    }
                }
            }
            doc.close();      
        }
    }

我需要的是实现字符串结果变量的访问。

因此可以从其他项目异步获取此变量

也许我需要一些GetResult();方法

我该怎么做?

谢谢!

如何实现异步..NET中外部使用的已完成事件

您可以将事件处理程序作为参数传递,然后在类库中的应用程序no中处理结果o只需传递回调并在下载完成后调用即可。

我是新来的,所以我希望我能理解你想要什么。

通过evnthandler

public void GetPageElementInnerHTML(字符串url、字符串元素、布尔findById、WebBrowserDocumentCompletedEventHandler downloadComplete)

使用代理人:

公共类WebGrabber{

        public string URL { set; get; }
        public string Element { set; get; }
        public bool FindByID { set; get; }
        private WebBrowser b { set; get; }
        private mshtml.IHTMLDocument2 doc { set; get; }
        public delegate void DownloadCompletedDelegate(string result);
        private DownloadCompletedDelegate _downloadedComplete;
        public void GetPageElementInnerHTML(string url, string element, bool findById, DownloadCompletedDelegate downloadComplete)
        {
            _downloadedComplete = downloadComplete;
            URL = url;
            Element = element;
            FindByID = findById;
            b = new WebBrowser();
            b.Navigate(url);
            b.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(b_DocumentCompleted);
        }
        void b_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            doc = (IHTMLDocument2)b.Document.DomDocument;
            string result = "<html>";
            IHTMLElement head = (IHTMLElement)((IHTMLElementCollection)doc.all.tags("head")).item(null, 0);
            result += "<head>" + head.innerHTML + "</head>";
            if (null != doc)
            {
                foreach (IHTMLElement element in doc.all)
                {
                    if (element is mshtml.IHTMLDivElement)
                    {
                        dynamic div = element as HTMLDivElement;
                        if (FindByID)
                        {
                            string id = div.id;
                            if (id == Element)
                            {
                                result += "<body>" + div.IHTMLElement_innerHTML + "</body></html>";
                                break;
                            }
                        }
                        else
                        {
                            string className = div.className;
                            if (className == Element)
                            {
                                result += "<body>" + div.IHTMLElement_innerHTML + "</body></html>";
                                break;
                            }
                        }
                    }
                }
            }
            doc.close();
            _downloadedComplete.Invoke(result);
        }
    }

在APP 中

GetPageElementInnerHTML(URL,元素,true/false,CompletedCallback);

private void CompletedCallback(字符串结果){//您的代码

}

以下是工作代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using mshtml;
using System.Collections;
namespace MyCompany.WebpageGrabber
{
    // A delegate type for hooking up change notifications.
    public delegate void ChangedEventHandler(object sender, EventArgs e);
    public class WebGrabber : ArrayList
    {
        // An event that clients can use to be notified whenever the
        // elements of the list change.
        public event ChangedEventHandler Changed;
        // Invoke the Changed event; called whenever list changes
        protected virtual void OnChanged(EventArgs e)
        {
            if (Changed != null)
                Changed(this, e);
        }
        // Override some of the methods that can change the list;
        // invoke event after each
        public override int Add(object value)
        {
            int i = base.Add(value);
            OnChanged(EventArgs.Empty);
            return i;
        }
        public override void Clear()
        {
            base.Clear();
            OnChanged(EventArgs.Empty);
        }
        public override object this[int index]
        {
            set
            {
                base[index] = value;
                OnChanged(EventArgs.Empty);
            }
        }
        public string URL { set; get; }
        public string Element { set; get; }
        public bool FindByID { set; get; }
        private WebBrowser b { set; get; }
        private mshtml.IHTMLDocument2 doc { set; get; }
        public void GetPageElementInnerHTML(string url, string element, bool findById)
        {
            URL = url;
            Element = element;
            FindByID = findById;
            b = new WebBrowser();
            b.Navigate(url);
            b.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(b_DocumentCompleted);
        }
        void b_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            doc = (IHTMLDocument2)b.Document.DomDocument;
            string result = "<html>";
            IHTMLElement head = (IHTMLElement)((IHTMLElementCollection)doc.all.tags("head")).item(null, 0);
            result += "<head>" + head.innerHTML + "</head>";
            if (null != doc)
            {
                foreach (IHTMLElement element in doc.all)
                {
                    if (element is mshtml.IHTMLDivElement)
                    {
                        dynamic div = element as HTMLDivElement;
                        if (FindByID)
                        {
                            string id = div.id;
                            if (id == Element)
                            {
                                result += "<body>" + div.IHTMLElement_innerHTML + "</body></html>";
                                break;
                            }
                        }
                        else
                        {
                            string className = div.className;
                            if (className == Element)
                            {
                                result += "<body>" + div.IHTMLElement_innerHTML + "</body></html>";
                                break;
                            }
                        }
                    }
                }
            }
            doc.close();
            this.Add(result);
        }
    }
}

这是我们称之为的代码

private void Window_Loaded(object sender, RoutedEventArgs e)
{
     WebGrabber g = new WebGrabber();
     g.GetPageElementInnerHTML("http://www.google.com/web/guest/home", "portlet-borderless-container", false);
     g.Changed += new ChangedEventHandler(g_Changed);            
}
void g_Changed(object sender, EventArgs e)
{
    var html = ((WebGrabber)sender)[0];            
}