2012-08-03 47 views
9

Tôi có phương thức có chữ ký mà tôi không thể thay đổi. Nó phải làSử dụng async đang đợi bên trong phương thức void

protected override void OnInitialize() 

Sử dụng Windows 8 Metro API Tôi cần kiểm tra xem tệp có tồn tại và đọc nó hay không, bên trong phương thức NoSignatureChange này. Sử dụng PlainOldCSharp, tôi sẽ viết một cái gì đó giống như

protected override void OnInitialize() 
{ 
    ... 
    try 
    { 
    var file = folder.OpenFile(fileName); 
    fileExists=true; 
    } 
    catch(FileNotFoundException) 
    { 
    fileExists=false 
    } 
} 

Hãy nhớ rằng, trong Windows 8 API only way to check if file exists is handling FileNotFoundException Ngoài ra, trong Windows 8 API tất cả FileIO API là async, vì vậy tôi chỉ có phương pháp file.OpenFileAsync.

Vì vậy, câu hỏi là: Làm thế nào tôi nên viết mã này sử dụng phương pháp folder.OpenFileAsync trong Windows 8 API mà không thay đổi chữ ký của người có chứa phương pháp

+0

Oh, và AsTask(). Đợi() có thể ném 3 ngoại lệ khác nhau chính nó –

+0

Tại sao chính xác bạn không thể thay đổi chữ ký của phương thức? – svick

+0

@svick Tôi đã cập nhật câu hỏi. –

Trả lời

18

Bạn vẫn có thể làm cho một void phương pháp async:

protected async void CannotChangeSignature() 
{ 
    ... 
} 

kiểu trả về giá trị cho một phương pháp async là:

  • void
  • Task
  • Task<T>

Tuy nhiên, nếu bạn muốn làm cho nó thực sự khối, sau đó bạn về cơ bản chiến đấu chống lại nền tảng này - toàn bộ vấn đề là để tránh chặn.

Bạn nói rằng bạn không thể thay đổi chữ ký - nhưng nếu bạn đang dựa vào chặn này thì bạn đã nhận để thay đổi cách bạn tiếp cận mã hóa.

Lý tưởng nhất là bạn nên thay đổi chữ ký để Task<bool>:

protected async Task<bool> CannotChangeSignature() 
{ 
    ... 
    try 
    { 
    await ApplicationData.Current.LocalFolder.GetFileAsync(fileName); 
    return true; 
    } 
    catch(FileNotFoundException) 
    { 
    return false; 
    } 
} 

EDIT: Nếu bạn thực sự cần một chặn một, bạn sẽ chỉ phải gọi AsTask().Wait(), bắt AggregateException và kiểm tra xem nó có chứa một FileNotFoundException. Nó thực sự là khá khủng khiếp mặc dù ... bạn có thể không thiết kế xung quanh này để nó không cần phải được ngăn chặn? Ví dụ, bắt đầu kiểm tra cho tập tin, và hiển thị một lỗi (hoặc bất cứ điều gì) nếu và khi bạn tìm thấy nó không tồn tại.

+1

Điều đó đang được nói, ngoài việc tôi sẽ không sử dụng 'Không thể' trong tên phương thức. Tôi không chắc liệu đó có phải là điều ngược lại hay không, nhưng nó làm cho nó khó hiểu hơn một chút để hiểu điều gì đang xảy ra ngay từ cái nhìn đầu tiên. Nhưng đó là ý kiến ​​khiêm tốn của tôi, tôi đoán ;-) –

+0

Jon, cảm ơn bạn đã trả lời. Có, tôi cần nó để chặn, và lý do là tôi sử dụng các thành phần khác trong ứng dụng của tôi và họ xác định giao diện. –

+0

Async void là nguy hiểm gây ra nó không chặn, và bạn không thể làm cho nó chặn, như tôi biết. –

Các vấn đề liên quan