【发布时间】:2014-10-29 13:53:58
【问题描述】:
更新:
public MobileServiceUser CurrentMsUser { get; private set; }
我有一个实例属性CurrentMsUser 已填充,我试图在异步方法中引用它,但由于某种原因它在方法中为空。我在属性设置器上设置了一个断点,它永远不会设置为空,所以我相当确定该属性永远不会变为空。在异步方法返回后,它再次出现。似乎一旦我在匿名异步方法中,我就无法访问该属性。这是我的方法:
public async Task CreateOrRetrieveAppUserAsync()
{
await Task.Run (async () => {
try {
var usersCollection = await _userTable.ToCollectionAsync ();
var users = usersCollection.
Where(x =>
x.FacebookToken == CurrentMsUser.UserId).
ToList();
if (users.Count == 1) {
CurrentRwUser = users [0];
} else {
CurrentRwUser = new User {
FacebookToken = CurrentMsUser.UserId,
GoogleToken = "test",
TwitterToken = "test",
MicrosoftToken = "test",
Email = "test@gmail.com",
FacebookId = App.FacebookProvider.GetCurrentUserId (),
Name = App.FacebookProvider.GetCurrentUserName ()
};
await InsertUserAsync (CurrentRwUser);
await SyncAsync();
}
} catch (Exception ex) {
Debug.WriteLine ("CreateOrRetrieveAppUser failed: {0}", ex.Message);
}
}).ConfigureAwait(continueOnCapturedContext:false);
}
【问题讨论】:
-
出于好奇,您为什么要将所有这些逻辑都包含在一个新任务中?
-
因为方法是从UI线程调用的
-
在哪里确切地是空的?似乎这是在设置
CurrentRwUser的值,所以在您调用此方法之前我会假设它为空?你是说它仍然是空的之后分配?你是怎么确定的?InsertUserAsync中是否为空?如果您在该方法的末尾输入Debug.WriteLine(CurrentRwUser.UserId),它是否会抛出NullReferenceException? -
它运行的线程应该是无关紧要的。如果长时间运行的操作是异步的,则 UI 将在它们运行时保持响应。
-
编辑:我的错字。变为空的是 CurrentMsUser,而不是 CurrentRwUser。 @MattBurland - 如果我打破这个方法的左大括号,它就存在,但是一旦我进入 Task.Run 调用中的匿名方法,它就是空的。如果我像您建议的那样运行调试语句,则在方法返回时针对 CurrentMsUser.UserId 它不为空。
标签: c# asynchronous task-parallel-library async-await c#-5.0