使用 WCF 的 Datagrid 的错误值
Wrong Values with Datagrid using WCF
我已经有一个 WCF restful 应用程序在工作,我尝试将 json 发送到 Winforms,但它给了我错误的值,有时会被阻止
这是我的 Winforms 按钮代码
private void button1_Click(object sender, EventArgs e)
{
WebClient proxy = new WebClient();
string serviceURL = string.Format("http://localhost:55495/EventService.svc/GetAllEvents/");
byte[] data = proxy.DownloadData(serviceURL);
Stream stream = new MemoryStream(data);
DataContractJsonSerializer obj = new DataContractJsonSerializer(typeof(EventDataContract));
EventDataContract Eventdatacontract = obj.ReadObject(stream) as EventDataContract;
string format = "MMM ddd d HH:mm yyyy";
dataGridView1.ColumnCount = 4;
dataGridView1.Columns[0].Name = "Event ID";
dataGridView1.Columns[1].Name = "Text";
dataGridView1.Columns[2].Name = "Start Date";
dataGridView1.Columns[3].Name = "End Date";
foreach (DataGridViewRow r in dataGridView1.Rows)
{
string[] row = new string[] { Eventdatacontract.EventID.ToString(), Eventdatacontract.Text, Eventdatacontract.Start_Date.ToString(format), Eventdatacontract.End_Date.ToString(format) };
dataGridView1.Rows.Add(row);
}
}
对于这样显示的数据
byte[] data = proxy.DownloadData(serviceURL);
负责阻塞UI。您应该考虑异步进行此调用,即:
byte[] data = await Task.Run(() => proxy.DownloadData(serviceURL));
注意:在方法中使用 await 关键字时,您必须更改方法签名。
你的情况:
private async void button1_Click(object sender, EventArgs e)
更新
当您找到可行的解决方案时,您还可以在此处添加异步函数以确保非阻塞 UI:
注:
http://msdn.microsoft.com/en-us/library/hh191443.aspx#BKMK_NamingConvention
By convention, you append "Async" to the names of methods that have an Async or async modifier.
using System.Net;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
...
private async Task<JArray> GetRESTDataAsync(string uri)
{
var webRequest = (HttpWebRequest)WebRequest.Create(uri);
var webResponse = (HttpWebResponse) await webRequest.GetResponseAsync();
var reader = new StreamReader(webResponse.GetResponseStream());
string s = await reader.ReadToEndAsync();
return await Task.Factory.StartNew(() => JsonConvert.DeserializeObject<JArray>(s));
}
您也可以使用 return await JsonConvert.DeserializeObjectAsync<JArray>(s);
,但 Json.NET 已将其标记为已过时并建议使用 Task.Factory.StartNew()
。
这是我的解决方案,只需安装 Install-Package Newtonsoft.Json 并将其添加到参考文献
public void button1_Click(object sender, EventArgs e)
{
try
{
dataGridView1.DataSource = GetRESTData("http://localhost:55495/EventService.svc/GetAllEvents");
}
catch (WebException webex)
{
MessageBox.Show("Es gab so ein Schlamassel! ({0})", webex.Message);
}
}
private JArray GetRESTData(string uri)
{
var webRequest = (HttpWebRequest)WebRequest.Create(uri);
var webResponse = (HttpWebResponse)webRequest.GetResponse();
var reader = new StreamReader(webResponse.GetResponseStream());
string s = reader.ReadToEnd();
return JsonConvert.DeserializeObject<JArray>(s);
}
我已经有一个 WCF restful 应用程序在工作,我尝试将 json 发送到 Winforms,但它给了我错误的值,有时会被阻止 这是我的 Winforms 按钮代码
private void button1_Click(object sender, EventArgs e)
{
WebClient proxy = new WebClient();
string serviceURL = string.Format("http://localhost:55495/EventService.svc/GetAllEvents/");
byte[] data = proxy.DownloadData(serviceURL);
Stream stream = new MemoryStream(data);
DataContractJsonSerializer obj = new DataContractJsonSerializer(typeof(EventDataContract));
EventDataContract Eventdatacontract = obj.ReadObject(stream) as EventDataContract;
string format = "MMM ddd d HH:mm yyyy";
dataGridView1.ColumnCount = 4;
dataGridView1.Columns[0].Name = "Event ID";
dataGridView1.Columns[1].Name = "Text";
dataGridView1.Columns[2].Name = "Start Date";
dataGridView1.Columns[3].Name = "End Date";
foreach (DataGridViewRow r in dataGridView1.Rows)
{
string[] row = new string[] { Eventdatacontract.EventID.ToString(), Eventdatacontract.Text, Eventdatacontract.Start_Date.ToString(format), Eventdatacontract.End_Date.ToString(format) };
dataGridView1.Rows.Add(row);
}
}
对于这样显示的数据
byte[] data = proxy.DownloadData(serviceURL);
负责阻塞UI。您应该考虑异步进行此调用,即:
byte[] data = await Task.Run(() => proxy.DownloadData(serviceURL));
注意:在方法中使用 await 关键字时,您必须更改方法签名。
你的情况:
private async void button1_Click(object sender, EventArgs e)
更新
当您找到可行的解决方案时,您还可以在此处添加异步函数以确保非阻塞 UI:
注: http://msdn.microsoft.com/en-us/library/hh191443.aspx#BKMK_NamingConvention
By convention, you append "Async" to the names of methods that have an Async or async modifier.
using System.Net;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
...
private async Task<JArray> GetRESTDataAsync(string uri)
{
var webRequest = (HttpWebRequest)WebRequest.Create(uri);
var webResponse = (HttpWebResponse) await webRequest.GetResponseAsync();
var reader = new StreamReader(webResponse.GetResponseStream());
string s = await reader.ReadToEndAsync();
return await Task.Factory.StartNew(() => JsonConvert.DeserializeObject<JArray>(s));
}
您也可以使用 return await JsonConvert.DeserializeObjectAsync<JArray>(s);
,但 Json.NET 已将其标记为已过时并建议使用 Task.Factory.StartNew()
。
这是我的解决方案,只需安装 Install-Package Newtonsoft.Json 并将其添加到参考文献
public void button1_Click(object sender, EventArgs e)
{
try
{
dataGridView1.DataSource = GetRESTData("http://localhost:55495/EventService.svc/GetAllEvents");
}
catch (WebException webex)
{
MessageBox.Show("Es gab so ein Schlamassel! ({0})", webex.Message);
}
}
private JArray GetRESTData(string uri)
{
var webRequest = (HttpWebRequest)WebRequest.Create(uri);
var webResponse = (HttpWebResponse)webRequest.GetResponse();
var reader = new StreamReader(webResponse.GetResponseStream());
string s = reader.ReadToEnd();
return JsonConvert.DeserializeObject<JArray>(s);
}