3

私はC#に少し慣れていないのでtextbox、非同期メソッドで値を取得する際に問題が発生しています。UI でテキスト入力を取得し、それをコードで使用するためのスレッドです。VS 2010 は私のコードを受け入れますが、デバッグを開始すると、次の例外が発生します Invalid cross-thread access。アイデア?何か不足していますか?

public void Response_Completed(IAsyncResult result)
{
    HttpWebRequest request = (HttpWebRequest)result.AsyncState;
    HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);

    using (StreamReader streamReader = new StreamReader(response.GetResponseStream()))
    {
        JObject rootObject = JObject.Load(new JsonTextReader(streamReader));

        string tracknum = trackid.Text; // Invalid cross-thread access exception
        string source = rootObject[tracknum]["source"].ToString();

        Deployment.Current.Dispatcher.BeginInvoke(() =>
        {
            //removed
        });
    }
}

注: Windows Phone 7 プラットフォームでこれを実行しようとしています。

4

2 に答える 2

1

他のスレッドではなく、UI スレッドでテキストボックスの値を取得する必要があります。Invoke メソッドは、指定されたデリゲートを UI スレッドで実行します。

string tracknum = (string)trackid.Invoke(new Func<string>(() => trackid.Text));

編集:

Windows Phone の場合:

string tracknum = string.Empty;
Deployment.Current.Dispatcher.BeginInvoke(() =>
   {
       tracknum = trackid.Text;
       string source = rootObject[tracknum]["source"].ToString();
   });
于 2012-10-31T03:54:46.553 に答える
0

オブジェクトが作成されたスレッドとは異なるスレッドからオブジェクトにアクセスしようとしたため、このような例外が発生します (スレッドに非同期でアクセスしようとしました)。

これを回避するには、コントロールの基になるウィンドウ ハンドルを所有するスレッドでデリゲートを実行する必要があります。そのような場合、私たちは使用することがありますInvoke(Delegate method)

public void Response_Completed(IAsyncResult result)
{
    this.Invoke((MethodInvoker)delegate
    {
         HttpWebRequest request = (HttpWebRequest)result.AsyncState;
         HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);
         using (StreamReader streamReader = new StreamReader(response.GetResponseStream()))
         {
            JObject rootObject = JObject.Load(new JsonTextReader(streamReader));
            string tracknum = trackid.Text; // Invalid cross-thread access exception
            string source = rootObject[tracknum]["source"].ToString();
         }
    });
}

MethodInvokervoid パラメーター リストを使用してメソッドを呼び出すために使用される単純なデリゲートを提供します。このデリゲートは、コントロールのメソッドを呼び出す場合Invoke、または単純なデリゲートが必要だが自分で定義したくない場合に使用できます。

ありがとう、
これがお役に立てば幸いです:)

于 2012-10-31T03:57:16.597 に答える