2011-11-11 29 views
6

Tôi đã thực hành API WinRT nhưng gặp phải một số vấn đề cần sự giúp đỡ của bạn.DataContractSerializer trong WinRT

Tôi muốn thử DataContractSerializer và tham khảo trang web này:

http://winrtstoragehelper.codeplex.com/

Mã:

Tôi nghĩ rằng nó phải được (bug?):

Stream inStream = await Task.Run(() => readStream.OpenRead()); 

Nhưng điều kỳ lạ nhất là nếu tôi chỉ sử dụng:

Stream inStream = readStream.OpenRead()); 

và tôi vượt qua dòng này vào:

DataContractSerializer.WriteObject 

API sẽ bị mắc kẹt mãi mãi.

Nhưng nếu tôi sử dụng:

Stream inStream = await Task.Run(() => readStream.OpenRead()); 

Và vượt qua dòng này vào WriteObject sau đó nó sẽ hoạt động tốt.

Tôi không biết tại sao triệu chứng này chỉ xảy ra nếu tôi không sử dụng Task.Runawait cho luồng.

Có ai cho tôi lời khuyên hoặc gợi ý nào không? Suối phương pháp


Nhưng

inStream = readStream.OpenRead() không được đặt tên là "async"

Tôi không biết lý do tại sao tôi cần phải tạo tác trên mục đích để làm điều này.

Cảm ơn.

Trả lời

4

Câu trả lời là trong các mô tả dự án:

"ObjectStorageHelper là một lớp Generic đơn giản hóa lưu trữ của dữ liệu trong các ứng dụng WinRT trong khi vẫn duy trì async * nguyên tắc * Metro-style ứng dụng. "

Tất cả các hoạt động của Tệp/IO trong WinRT đều không đồng bộ, do đó cần sử dụng các phương thức không đồng bộ (để có được kết quả, ít nhất). Từ khóa "await" mới là một cách để thực hiện điều này, mặc dù bạn cũng có thể chỉ định rõ ràng một hàm gọi lại để xử lý việc hoàn thành thao tác không đồng bộ.

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