Unauthorizedaccessexception {"Неверный доступ между потоками."} ... происходит - PullRequest
0 голосов
/ 24 августа 2011

Я хочу коротко закоротить свой URL, но возникает исключение, когда я хочу указать строку для моего текстового блока

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        ShortenUrl(textBox1.Text);
    }
    enum Format
    {
        XML,
        JSON,
        TXT
    }

    enum Domain
    {
        BITLY,
        JMP
    }

    void ShortenUrl(string longURL)
    {
        Format format = Format.XML;
     Domain   domain = Domain.BITLY;
        string _domain;
        //string output;

        // Build the domain string depending on the selected domain type
        if (domain == Domain.BITLY)
            _domain = "bit.ly";
        else
            _domain = "j.mp";

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(
            string.Format(@"http://api.bit.ly/v3/shorten?login={0}&apiKey={1}&longUrl={2}&format={3}&domain={4}",
            "username", "appkey", HttpUtility.UrlEncode(longURL), format.ToString().ToLower(), _domain));

        request.BeginGetResponse(new AsyncCallback(GetResponse), request);

    }
    void GetResponse(IAsyncResult result)
    {
        XDocument doc;
        HttpWebRequest request = (HttpWebRequest)result.AsyncState;
        HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);

            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
                string responseString = reader.ReadToEnd();
                doc = XDocument.Load(reader.BaseStream);
            }

            ////  var x = from c in doc.Root.Element("data").Elements()
            //          where c.Name == "url"
            //          select c;

            //XElement n = ((IEnumerable<XElement>)x).ElementAt(0);
            //   textBox2.Text = ((IEnumerable<String>)x).ElementAt(0);

            lista = (from Born_rich in doc.Descendants("url")

                     select new a()
                     {
                         shrtenurl = Born_rich.Value
                     }).ToList();
            output = lista.ElementAt(0).shrtenurl;
            textBox2.Text = output;

       //
                // 


    //      textBox2.Text = s;
    }
    List<a> lista = new List<a>();



    String output;  
}
public class  a
{
    public String shrtenurl { set; get; }
}

1 Ответ

10 голосов
/ 24 августа 2011

Обратный вызов из HttpWebRequest происходит в потоке без пользовательского интерфейса. Если вы хотите изменить что-то в пользовательском интерфейсе, вы должны сделать это в потоке пользовательского интерфейса. Удача есть простой способ сделать это. Вы просто используете диспетчер для вызова соответствующего кода в пользовательском интерфейсе.

Dispatcher.BeginInvoke(() => textBox2.Text = output);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...