gpt4 book ai didi

c# - 未经授权的访问异常 : Invalid cross-thread access in Silverlight application (XAML/C#)

转载 作者:可可西里 更新时间:2023-11-01 08:16:04 24 4
gpt4 key购买 nike

C# 相对较新,想尝试使用它来使用一些第三方 Web 服务 API。

这是XAML代码

    <Grid x:Name="ContentGrid" Grid.Row="1">
<StackPanel>
<Button Content="Load Data" Click="Button_Click" />
<TextBlock x:Name="TwitterPost" Text="Here I am"/>
</StackPanel>
</Grid>

这是C#代码

    private void Button_Click(object sender, RoutedEventArgs e)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://api.twitter.com/1/users/show/keykoo.xml");
request.Method = "GET";

request.BeginGetResponse(new AsyncCallback(twitterCallback), request);
}

private void twitterCallback(IAsyncResult result)
{
HttpWebRequest request = (HttpWebRequest)result.AsyncState;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);
TextReader reader = new StreamReader(response.GetResponseStream());
string strResponse = reader.ReadToEnd();

Console.WriteLine("I am done here");
TwitterPost.Text = "hello there";
}

我猜这是由于回调在与 UI 不同的线程上执行的事实造成的?在 C# 中处理这些类型的交互的正常流程是什么?

谢谢。

最佳答案

通过 CheckAccess 调用轻松进行跨线程访问的一种有用方法是将实用方法包装在静态类中 - 例如

public static class UIThread
{
private static readonly Dispatcher Dispatcher;

static UIThread()
{
// Store a reference to the current Dispatcher once per application
Dispatcher = Deployment.Current.Dispatcher;
}

/// <summary>
/// Invokes the given action on the UI thread - if the current thread is the UI thread this will just invoke the action directly on
/// the current thread so it can be safely called without the calling method being aware of which thread it is on.
/// </summary>
public static void Invoke(Action action)
{
if (Dispatcher.CheckAccess())
action.Invoke();
else
Dispatcher.BeginInvoke(action);
}
}

然后您可以像这样在后台线程中包装任何更新 UI 的调用:

private void twitterCallback(IAsyncResult result)   
{
HttpWebRequest request = (HttpWebRequest)result.AsyncState;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);
TextReader reader = new StreamReader(response.GetResponseStream());
string strResponse = reader.ReadToEnd();

UIThread.Invoke(() => TwitterPost.Text = "hello there");
}

这样你就不必知道你是否在后台线程上,它避免了为每个控件添加方法来检查它的开销。

关于c# - 未经授权的访问异常 : Invalid cross-thread access in Silverlight application (XAML/C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3420282/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com