2015-01-30 2 views
0

일부 파일을 관리하는 추상 클래스 FilesManager이 있습니다.비동기 메서드를 동 기적으로 구현

http request을 통해 클라우드 서버에 파일을 저장하거나 읽고있을 수 있으므로이 메서드는 asynchronous으로 표시하고 싶기 때문에 Task<>으로 표시됩니다.

그러나 지금은 로컬 디스크에 파일을 저장합니다 (synchronusly).

오류를 수정하려면 Task 빈칸을 반환해도 괜찮습니까? 예를 들어

각 방법은 Task<> 객체를 반환 할 것으로 예상되기 때문에 LocalDiskFilesManager 아래의 구현은, 예외를 발생

return Task.Factory.StartNew(() => { return; }); 

.

public abstract class FilesManager 
{ 
    public abstract Task SaveFileAsync(XDocument xDocument); 
    public abstract Task<XDocument> GetFileAsync(Guid file_Id); 
} 

// Synchronously 
public class LocalDiskFilesManager : FilesManager 
{ 
    public override Task SaveFileAsync(XDocument xDocument) 
    { 
     string path = GetFilePath(); 
     xDocument.Save(path); 

     // is ok to return an empty task? does it affects the performance/threads? 
     // return Task.Factory.StartNew(() => { return; }); 
    } 

    public override Task<XDocument> GetFileAsync(Guid file_Id) 
    { 
     string path = GetFilePath(file_Id); 
     XDocument xDocument = XDocument.Load(path); 

     return xDocument; 

     // is ok to return an empty task? does it affects the performance/threads? 
     // return Task<XDocument>.Factory.StartNew(() => { return xDocument; }); 
    } 
} 
+0

는 또한 [이 답변] (http://stackoverflow.com/a/11782373/706456) – oleksii

+0

내가 생각 참조 대답은 동기식으로 비동기 작업을 실행하는 방법을 설명하지만, 동기식 작업을 비동기로 "가짜"만드는 방법을 알아야합니다. – Catalin

답변

3

지금은 Task.FromResult을 사용하는 것이 더 낫습니다.

지정된 결과로 성공적으로 완료된 Task<TResult>을 만듭니다.

예 :

public override Task<XDocument> GetFileAsync(Guid file_Id) 
{ 
    string path = GetFilePath(file_Id); 
    XDocument xDocument = XDocument.Load(path); 

    return Task.FromResult(xDocument); 
} 

실제로 별도의 작업을 계획하지 않으므로 스레드 문제를 해결해야합니다.

그리고 제네릭이 아닌 Task에 대한

, 나는 보통 단지 할 것 :

private static Task _alreadyDone = Task.FromResult(false); 

public override Task SaveFileAsync(XDocument xDocument) 
{ 
    string path = GetFilePath(); 
    xDocument.Save(path); 

    return _alreadyDone; 
} 
+0

좋아요! 고맙습니다. '_alreadyDone'을 정적으로 표시 한 특별한 이유가 있습니까? – Catalin

+0

@RaraituL - 조숙 한 최적화입니다.'return Task.FromResult (false); '메소드를 사용할 수 있습니다.하지만 그 태스크에서 흥미로운 점이 없으므로, 우리는 한 번만 만들고 한 번만 반환 할 수 있습니다. 할당 저장 중. –

관련 문제