C# 新手:使用GetAsync的跨线程访问无效

C# 新手:使用GetAsync的跨线程访问无效,c#,facebook-c#-sdk,C#,Facebook C# Sdk,我很欣赏GetAsync是异步的,但是我找不到任何关于如何使用它的文档。在这个阶段,我只想得到我的名字并将其分配给一个文本块。当然,如果我在_fbClient.GetCompleted+=/_fbClient.GetAsync(“/me”)块中执行此操作,它将获得无效的跨线程访问异常错误 在下面的代码中,NameTextBlock控件当然设置为“[EMPTY]”,一段时间后,会执行标记为====>的行,从而导致错误 我看到的少数几个示例使用了一种似乎是同步Get方法的方法,但这种方法似乎已经过时

我很欣赏GetAsync是异步的,但是我找不到任何关于如何使用它的文档。在这个阶段,我只想得到我的名字并将其分配给一个文本块。当然,如果我在_fbClient.GetCompleted+=/_fbClient.GetAsync(“/me”)块中执行此操作,它将获得无效的跨线程访问异常错误

在下面的代码中,NameTextBlock控件当然设置为“[EMPTY]”,一段时间后,会执行标记为====>的行,从而导致错误

我看到的少数几个示例使用了一种似乎是同步Get方法的方法,但这种方法似乎已经过时了(无论如何我都不想使用它)

string name=“EMPTY”;
尝试
{
_fbClient.GetCompleted+=
(o,e)=>
{
如果(e.Error==null)
{
var result=(IDictionary)e.GetResultData();
//Dispatcher.BeginInvoke(()=>MyData.ItemsSource=result);
var tempname=(字符串)结果[“name”];
名称=(字符串)结果[“名称”];
NameTextBlock.Text=“[”+名称+“]”;
}
其他的
{
MessageBox.Show(例如Error.Message);
}
};
_fbClient.GetAsync(“/me”);
//====>NameTextBlock.Text=“[”+name+“]”;
}
抓住
{
MessageBox.Show(“失败..处理问题”);
}
最后
{
NameTextBlock.Text=“[”+名称+“]”;
}

您遇到的问题是,一个非Gui线程试图更改UI元素(我忘记了正确的术语)

在WPF中,您使用该模式来解决第二个问题。在Winforms中,您使用该模式

为了对抗比赛状态。。。打电话之前

_fbClient.GetAsync("/me");
将NameTextBlock.Text设置为“加载…”或“获取…”或类似的内容。这样,当异步调用完成时,它可以用正确的详细信息填充文本框。您可能还希望更改样式,以使其对用户更加明显(如加载时为灰色,获得结果时为亮红色)。现在所做的是假设在将textbox的文本设置为name变量时,事件(异步调用)已经完成。可能是这样,也可能不是这样

用一种更简单的方式来想象它。两个人在车库里。你派一个去打开车库门,另一个去开货车进车库。在你目前的代码中,驾驶面包车的人正在驶入车库,而不是检查或关心车库门是否打开

下一个问题是。“name”变量可以同时读取和分配,这意味着读取操作可能在易失性存储器上运行,并且很可能导致错误/问题-尤其是在更大的范围内

我建议你看一看,以便有更好的想法


有很多信息需要消化,对不起。希望能有帮助

答案在您提供的代码片段中。
使用如下方法:

Dispatcher.BeginInvoke(() => NameTextBlock.Text = "[" + name + "]");

有人能提醒我从错误的线程访问UI元素的正确术语是什么吗?我会为此失眠的^^
Dispatcher.BeginInvoke(() => NameTextBlock.Text = "[" + name + "]");