作者QQ29 (我爱阿蓉)
看板C_Sharp
标题[问题] C# 5.0 and Win8 winRT
时间Fri Nov 11 22:33:15 2011
各位好
不晓得各位版大 有没有使用过C# 5.0
最近有在练习
之前有用过DataContractSerializer的API
想要在win8 winRT上写写看
我遇到一些问题 於是google了一下
http://winrtstoragehelper.codeplex.com/
请各位帮忙看一下
他有一段code非常诡异
Stream inStream = Task.Run(() => readStream.OpenRead()).Result;
我觉得该写成
Stream inStream = await Task.Run(() => readStream.OpenRead());
因为要真的等到他做完, 怀疑他写错 是bug
但是其实我一开始是写成
Stream inStream = readStream.OpenRead(); 毕竟这API不是Async的
结果我把这inStream塞到 DataContractSerializer::WriteObject里面
这API就完全的卡住了 程式Hang住
但我改成
Stream inStream = await Task.Run(() => readStream.OpenRead());
神奇的就不会hang了
我想了很久 完全无法参透这问题...
开Task.Run做事结束後再执行 跟 直接呼叫 做完 竟然有差异
请问有人知道为啥吗
或是给点意见@@
http://tinyurl.com/6mmgcsm
参考这网页 也有人提问
但没回应
请大家看一下
感谢~
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 27.246.206.82
1F:推 LaPass:改版的好快.... 一阵子没写C#,就又升级了 = =" 11/12 02:37
2F:→ james732:C#的版本号码快要赶上Java了...XDD 11/12 15:52
3F:推 ngulin0911:推改版的好快...... 11/12 22:52
4F:推 deuter:Task.Result 就已经会等做完才传回result 11/14 00:59
5F:→ deuter:await不是指"等"他做完, 而是指把後面剩下的 statements 11/14 01:00
6F:→ deuter:加到continuation 11/14 01:00
7F:→ QQ29:await 应该会等Task.Run这Task做完吧? 然後才会下一行 11/14 12:12
8F:→ QQ29:但照理讲 以现在的code来看 我没必要开Task.Run不是吗 11/14 12:13
9F:→ deuter:await不会等做完, 否则就失去async的意义了 11/14 15:54
11F:→ deuter:不过没用过StorageFile class 11/14 15:55
12F:→ QQ29:我认为会等他做完耶 如果Task是worker thread 会先让UIthread 11/14 17:06
13F:→ QQ29:去做事阿 11/14 17:07
14F:→ QQ29:请问Task.Result 会等他做完才回传 是哪里有document呀 11/14 17:07
15F:→ deuter:没写清楚,await是等做完後再接下去执行後面的程式,但是会 11/15 12:56
16F:→ deuter:马上return caller, 不会block current thread 11/15 12:56
18F:→ deuter:"The get accessor for this property ensures that the 11/15 12:57
19F:→ deuter:asynchronous operation is complete before returning." 11/15 12:57