使用 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);
    }