سؤال

لدي عنصر تحكم WebBrowser والذي يتم إنشاء مثيل له ديناميكيًا من سلسلة STA في الخلفية لأن مؤشر الترابط الأصلي هو BackgroundWorker ولديه الكثير من الأشياء الأخرى التي يجب القيام بها.

تكمن المشكلة في أن حدث التنقل لا يتم إطلاقه أبدًا، إلا إذا قمت بفتح messageBox.Show() في الطريقة التي أخبرته بـ .Navigate().سأشرح:

ThreadStart ts = new ThreadStart(GetLandingPageContent_ChildThread);
Thread t = new Thread(ts);
t.SetApartmentState(ApartmentState.STA);
t.Name = "Mailbox Processor";
t.Start();

protected void GetLandingPageContent_ChildThread()
{
 WebBrowser wb = new WebBrowser();
 wb.Navigated += new WebBrowserNavigatedEventHandler(wb_Navigated);
 wb.Navigate(_url);
 MessageBox.Show("W00t");
}

protected void wb_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
 WebBrowser wb = (WebBrowser)sender; // Breakpoint
 HtmlDocument hDoc = wb.Document;
}

هذا يعمل بشكل جيد.لكن صندوق الرسائل سوف يعيق الطريق نظرًا لأن هذا تطبيق تلقائي.عندما أقوم بإزالة messageBox.Show()، لا يتم تشغيل الحدث WebBrowser.Naviated مطلقًا.لقد حاولت استبدال هذا السطر بـ Thread.Sleep()، وعن طريق تعليق الخيط الأصلي.

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

لماذا يفعل ذلك؟كيف يمكنني إصلاح ذلك؟

إذا كان بإمكان شخص ما أن يقدم لي طريقة لجلب محتوى صفحة ويب، وملء بعض البيانات، وإرجاع محتوى الصفحة على الجانب الآخر من زر الإرسال، كل ذلك مقابل خادم ويب لا يدعم أفعال POST ولا تمرير البيانات عبر QueryString، سأقبل أيضًا هذه الإجابة لأن هذا التمرين بأكمله سيكون غير ضروري.


حل: انتهى بي الأمر بعدم استخدام خيط الخلفية والعبد على الإطلاق بناءً على اقتراح مهندس الفريق...ولو على حساب الاستجابة :(

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

المحلول

WebBrowser لن يفعل الكثير إلا إذا تم عرضه وكان مرتبطًا بمؤشر ترابط واجهة المستخدم؛هل تظهر النموذج الذي يتواجد عليه؟تحتاج إلى استخدام DOM وما إلى ذلك.يمكن أن يكون النموذج خارج الشاشة إذا كنت لا ترغب في عرضه للمستخدم، ولكنه لن يعمل بشكل جيد في الخدمة (على سبيل المثال).

لأغراض التجريد، يمكنك عادةً محاكاة متصفح HTML عادي باستخدام WebClient إلخ.هل هذا غير كاف؟يمكنك استخدام أدوات مثل "العابث"للتحقق من الطلب الدقيق الذي يتعين عليك تقديمه إلى الخادم.لأكثر من ذلك، يمكنك إلقاء نظرة على حزمة أجيليتي HTML, ، والذي يوفر وصول DOM إلى HTML بدون متصفح.

نصائح أخرى

لن يتم إطلاق الحدثين Naviged وDocumentComplete إذا تم تعيين رؤية WebBrowser على false.يمكنك التغلب على هذا القيد عن طريق جعل WebBrowser مرئيًا ولكن مع تعيين موقعه بحيث يكون خارج واجهة المستخدم مثل:

wb.Visible = true;
wb.Left = -wb.Width; // notice the minus sign

تحتاج إلى إضافة سطر مثل هذا:

webBrowser1.Navigated += new WebBrowserNavigatedEventHandler(webBrowser1_Navigated);

أين webBrowswer1_Navigated هي الوظيفة التي تريد استدعاؤها عند إطلاق الحدث.

هل هناك موضوع واجهة المستخدم الرسومية قد بدأ بالفعل؟ربما يستخدم كائن WebBrowser مؤشر ترابط واجهة المستخدم الرسومية للتعامل مع الأحداث.في هذه الحالة، يجب عليك استدعاء Application.Run() من مؤشر الترابط الذي يقوم بإنشاء WebBrowser (استبدل messageBox.Show() بهذا).سيتم تعليق Application.Run() حتى يتم استدعاء Application.Exit().

تحاول اختبار هذا الآن.

انتهى بي الأمر بعدم استخدام خيط الخلفية والعبد على الإطلاق بناءً على اقتراح مهندس الفريق...ولو على حساب الاستجابة :(

لا يمكن أن يعمل عنصر تحكم WebBrowser إذا لم يكن موجودًا في مؤشر ترابط STA.إذا كنت تريد استخدام مثيل WebBrowser في سلسلة محادثات، فأنت بحاجة إلى إنشاء سلسلة المحادثات الخاصة بك والاتصال بها Thread.SetApartmentState(ApartmentState.STA);

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top