2014-09-04 2 views
0
UPDATE

: 내가 채워집니다 내가 비동기 메서드 내에서이를 참조하기 위해 노력하고있어 인스턴스 속성 CurrentMsUser을 가지고 있지만 어떤 이유가에 널인스턴스 변수는 Task.Run 내부 null의

public MobileServiceUser CurrentMsUser { get; private set; } 

방법. 나는 속성 setter에 중단 점을 설정했고 결코 null로 설정되지 않으므로 프로퍼티가 null이 될 수 없다는 것이 확실합니다. 비동기 메서드가 반환 된 후 다시 나타납니다. 익명 비동기 메서드를 사용하는 즉시 속성에 액세스 할 수없는 것 같습니다. 내 방법은 다음과 같습니다

+2

호기심에서 벗어나서, 왜 그 모든 논리를 새로운 작업으로 래핑하고 있습니까? –

+0

UI 스레드에서 메서드가 호출되었으므로 – winnicki

+1

* * 정확히 * null입니까? 그것은 이것이 CurrentRwUser'의 값을 설정하는 것 같아요. 그래서 당신이이 메서드를 호출하기 전에 null이라고 가정했을 것입니다. 과제가 끝난 후에도 여전히 null *이라고 말하고 있습니까? 그걸 어떻게 결정하니? 'InsertUserAsync'에서 null입니까? 만약 당신이'Debug.WriteLine (CurrentRwUser.UserId)'메소드를 던지면'NullReferenceException'을 던집니까? –

답변

3

변수는 스레드 로컬이므로 그 값은 주 스레드에서만 액세스 할 수 있습니다.

이 문제를 피하려면 백그라운드 스레드로 이동하기 전에 주 스레드에서 해당 변수의 값을 가져와야합니다.

public async Task CreateOrRetrieveAppUserAsync() 
{ 
    var userId = CurrentMsUser.UserId; 
    await Task.Run (async() => { 
    //... 
    //use userId here 
    }); 
} 
당신이 어떤 긴 실행 CPU 바운드 일이 나타나지 않습니다 주어진 물론

, 당신이 여기가 그 모든 작업이 이미 비동기 작업 기반의 IO 작업, 당신은해야 간단히 Task.Run 호출을 완전히 제거 할 수 있습니다. 어떤 작은 CPU가 작동하도록 허용합니까? 이 UI 스레드에서 실행되어야하며, 오랜 실행 작업이 모두 이미 비동기로되어 있기 때문에 전혀 차단하지 않아야합니다.

아, 첫 번째 항목 인 usersCollection 만 필요하므로 전체 결과 집합을 메모리에 저장하지 않으려면 ToList이 아닌 First을 사용해야합니다. First필터링을 수행하여을 호출하기 전에 가능하면 전체 컬렉션을 응용 프로그램에 구체화하는 대신 쿼리 공급자를 통해 필터링하십시오.

+0

나는'App.FacebookProvider.GetCurrentUserId'와'App.FacebookProvider.GetCurrentUserName'이 장기간 실행되고 비동기 적이라는 말을 듣고 있습니다. 또는 아마도'usersCollection'이 거대합니다. –

+0

이것은 작동하지만 실제로 인스턴스 변수가 처음에는 null이되는 이유에 대해서는 실제로 대답하지 않습니다. 고마워요 – winnicki

+0

@ DanielMann 그들은 비동기 아니라 오래 실행되지 않습니다 .. 그냥 이미 채워진 변수에서 잡는. usersCollection도 약 20 행에 불과합니다. – winnicki

관련 문제