0

こんにちはみんな私は例外を受け取りますif (checkBox1.IsChecked == true || checkBox2.IsChecked == true)

別のスレッドがオブジェクトを所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません。

私のwpfアプリで:

private void button1_Click(object sender, RoutedEventArgs e)
{
    int i = 0;
    int j = Int32.Parse(textBox1.Text);
    thr = new Thread[j];
    for (; i < j; i++)
    {
        thr[i] = new Thread(new ThreadStart(go));
        thr[i].IsBackground = true;
        thr[i].Start();
    }
}

public void go()
{
    while (true)
    {
       string acc = "";
       string proxy = "";
       if (checkBox1.IsChecked == true || checkBox2.IsChecked == true)
       {
           if (checkBox1.IsChecked == true)
               Proxy.type = "http";
           else if (checkBox2.IsChecked == true)
               Proxy.type = "socks5";
           else
               Proxy.type = "none";
           proxy = rand_proxy();
       }
    }
}

なんで?

4

4 に答える 4

3

作成されたスレッド以外のスレッドからUI要素にアクセスすることはできません。チェックボックスはUIスレッドで作成され、UIスレッドでのみアクセスできます。これを試して。

public void go()
    {
        Dispatcher.BeginInvoke(new Action(()=>{
        while (true)
        {
            string acc = "";
            string proxy = "";
            if (checkBox1.IsChecked == true || checkBox2.IsChecked == true)
            {
                if (checkBox1.IsChecked == true)
                    Proxy.type = "http";
                else if (checkBox2.IsChecked == true)
                    Proxy.type = "socks5";
                else
                    Proxy.type = "none";
                proxy = rand_proxy();
            }
}), null);
}
于 2013-03-19T16:42:16.133 に答える
0

UIとは異なるスレッドのUI要素にアクセスすることはできません。これを回避するには、次のことを確認してください

checkBox1.Dispatcher.CheckAccess()

真の場合は、

checkBox1.Dispatcher.Invoke

また

checkBox1.Dispatcher.BeginInvoke
于 2013-03-19T16:41:28.693 に答える
0

CheckAccessを使用して、 Dispatcher.BeginInvokeまたはInvokeを呼び出す必要があるかどうかを確認します。この投稿も参照してください。

于 2013-03-19T16:41:31.867 に答える
0

基本的に、作成されたスレッド以外のスレッドからコントロールにアクセスすることは許可されていません。ここにWPFスレッドモデルの適切な説明があり、これはあなたが説明している問題をウォークスルーします。

幸運を。

于 2013-03-19T16:44:47.273 に答える