我正在使用MVVM Light框架和MVVM ViewModelLocator,并且有一个方法如下:
protected override System.Threading.Tasks.Task<string> GetFromUri(string uriString)
{
string outString;
TaskCompletionSource<string> tcs = new TaskCompletionSource<string>();
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(uriString, UriKind.RelativeOrAbsolute));
request.Method = "GET";
request.BeginGetResponse((result) =>
{
WebResponse response = request.EndGetResponse(result);
using (var inStream = response.GetResponseStream())
{
long length = inStream.Length;
byte[] inBytes = new byte[length];
inStream.Read(inBytes, 0, (int)length);
outString = Encoding.UTF8.GetString(inBytes, 0, (int)length);
tcs.TrySetResult(outString);
}
}
, null);
return tcs.Task;
}
...我想在“设计模式”中使用它。似乎最好的地方称之为
if (IsInDesignModeStatic)
{
//....
}
在ViewModel的构造函数中。但是,它以“交叉线程”异常失败。在Application.Current.RootVisual的Dispatcher.Invoke中包装调用会使我们超过“交叉线程”异常,但会导致“无法访问已处置的对象”(引用调度程序对象)。
在Windows Phone 8上使用MVVM Light框架,您是否可以在设计模式下执行Web请求(我看不出任何技术原因)?如果ViewModel构造函数是错误的地方,那么什么是正确的地方?
答案 0 :(得分:0)
问题源于使用HttpWebRequest。重写使用HttpClient(NuGet上可用的System.Net.Http库)解决了这个问题。