Почему я получаю эту ошибку?

enter image description here

System.InvalidCastException was unhandled by user code
  Message=Specified cast is not valid.
  Source=System.Windows.Forms
  StackTrace:
       at System.Windows.Forms.UnsafeNativeMethods.IHTMLDocument2.GetLocation()
       at System.Windows.Forms.WebBrowser.get_Document()
       at System.Windows.Forms.WebBrowser.get_DocumentStream()
       at System.Windows.Forms.WebBrowser.get_DocumentText()
       at SiteBot.MainWindow.backgroundWorker1_DoWork(Object sender, DoWorkEventArgs e) in D:\Documents\Visual Studio 2010\Projects\SiteBot\MainWindow.cs:line 35
       at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
       at System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)
  InnerException: 
2
Hooch 11 Мар 2011 в 05:18
12
Видите ссылку "Копировать детали исключения в буфер обмена"? Пожалуйста, вставьте результат в свой вопрос.
 – 
Kirk Woll
11 Мар 2011 в 05:19
Я бы включил Framework Source Stepping и Symbol Server. Это позволит отображать исключение в коде, который его генерирует.
 – 
Ritch Melton
11 Мар 2011 в 05:20
Эээ ... можете ли вы получить доступ к компоненту WebBrowser в потоке без графического интерфейса?
 – 
Ritch Melton
11 Мар 2011 в 05:21
Было бы хорошо, если бы вы могли вставить значение для webBrowserMain.DocumentText
 – 
Divi
11 Мар 2011 в 05:24
8
Хаахахаха ... кто нибудь заходил на сайт? Этот чувак пытается доить деньги, автоматизируя клики по рекламе.
 – 
Ritch Melton
11 Мар 2011 в 05:57

2 ответа

Лучший ответ

Следующее решает вашу проблему с перекрестной резьбой.

public delegate string GetStringHandler();
public string GetDocumentText()
{
    if (InvokeRequired)
        return Invoke(new GetStringHandler(GetDocumentText)) as string;
    else
        return webBrowser.DocumentText;
}

if (regAddId.IsMatch(GetDocumentText()))
{
}
7
Fun Mun Pieng 11 Мар 2011 в 05:58

В этом тесте я получаю исключение потоковой передачи:

public class Test
{
    private readonly WebBrowser wb;

    public Test()
    {
        wb = new WebBrowser();
        var bw = new BackgroundWorker();
        bw.DoWork += DoWork;
        bw.RunWorkerAsync();

        while (bw.IsBusy)
        {
            Thread.Sleep(10);
            Application.DoEvents();
        } 
    }

    private void DoWork(object sender, DoWorkEventArgs e)
    {
        wb.Navigate(@"www.clix-cents.com/pages/clickads");
        Thread.Sleep(1000);
        var regex = new Regex("onclick=\\'openad\\(\"([\\d\\w]+\"\\);");
        regex.IsMatch(wb.DocumentText);
    }
}

public class Program
{
    [STAThread]
    public static void Main(string[] args)
    {
        new Test();
    }
}

Исключение выглядит так: Exception

Поскольку WebBrowser на самом деле является просто оболочкой для элемента управления ActiveX IE, вам нужно быть осторожным с проблемами потоковой передачи. Я думаю, что вы действительно хотите использовать здесь WebClient, а не WebBrowser, но я просто догадываюсь о вашем приложении.

[РЕДАКТИРОВАТЬ]

Как и в @Fun, вы можете просто вызвать поток графического интерфейса (при условии, что элемент управления был создан именно там. Я бы по-прежнему рекомендовал использовать WebClient.

0
Ritch Melton 11 Мар 2011 в 06:12