هل يمكن أن تعطيني مثالا على WebClient تنزيل الشفرة المصدرية الموقع وتصفية شيء بشكل غير متزامن حتى لا تجميد واجهة المستخدم الرسومية؟

StackOverflow https://stackoverflow.com/questions/1634665

  •  06-07-2019
  •  | 
  •  

سؤال

ولقد قرأت بعض المواد على MSDN لكنها ليست تماما ما أحتاج الآن.

هل يمكن أن تريني تطبيق بسيط الذي يقوم بتحميل موقع على شبكة الانترنت asyncchronously (WebClient.DownloadDataAsync) وبعد ذلك بتصفية علامة العنوان للموقع؟

لا أستطيع أن أفعل هذا من أجل حياة لي، وأنا أحاول فقط أن نرى قطع نموذج واضح.

هل كانت مفيدة؟

المحلول

وأنت قد تجد أنه من الأسهل استخدام DownloadStringAsync. بهذه الطريقة، يمكنك تحليل HTML كسلسلة بدلا من الاضطرار إلى التعامل مع الترميز نفسك.

وبقدر ما كيفية تحليل العنوان، قد تجد أن قليلا من الصعب القيام به، منذ .NET لا يملك المدمج في محلل HTML. قد تتمكن من محاولة بعض التعابير المنطقية أو استخدام XmlReader، ولكن هذه يمكن أن يكون مشكلة إذا كنت قد المشوهة أو محتوى صعبة.

var client = new WebClient();
client.DownloadStringCompleted += (s, args) => {
    if (args.Error == null && !args.Cancelled) {
        var regex = new Regex("<title>(?<title>.*?)</title>");
        var match = regex.Match(args.Result);
        if (match.Success)
        {
            var myTitle = match.Groups["title"].Value;
            // ... 
        }
    }
};
client.DownloadStringAsync(url);

نصائح أخرى

وهنا هو الحل الكامل الذي يستخدم المندوبين غير متزامن . لاحظ أن أستخدمه Control.Invoke لضمان أن أي تفاعلات UI يتم تنفيذها على موضوع UI الرئيسي، في هذه الحالة عرض مربع الرسالة.

var button = new Button {Text = "Run"};
button.Click +=
    (sender, e) =>
        {
            var fetchTitle = new Func<string, string>(
                address =>
                    {
                        var html = new WebClient().DownloadString(address);
                        var match = Regex.Match(html, "<title>(.*)</title>");
                        return match.Groups[1].Value;
                    });
            var displayTitle = new Action<string>(
                title => MessageBox.Show(title));
            fetchTitle.BeginInvoke(
                "http://stackoverflow.com",
                result =>
                    {
                        var title = fetchTitle.EndInvoke(result);
                        if (button.InvokeRequired)
                        {
                            button.Invoke(displayTitle, title);
                        }
                        else
                        {
                            displayTitle(title);
                        }
                    },
                null);
        };
new Form {Controls = {button}}.ShowDialog();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top