使用WCF使用Datagrid的错误值

时间:2015-08-10 20:46:02

标签: c# winforms wcf datagrid

我已经有一个WCF restful apps工作了,我试着把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);
        }


    }

表示这样显示的数据 enter image description here

2 个答案:

答案 0 :(得分:1)

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

  

按照惯例,您将“Async”附加到具有Async或async修饰符的方法的名称。

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()

答案 1 :(得分:0)

这是我的解决方案,只需安装 Install-Package Newtonsoft.Json 并将其添加到参考

public static class SpeechSynthetizerManager
{
    private static readonly SpeechSynthesizer synth = new SpeechSynthesizer();
    private static readonly SpeechRecognitionEngine speechRecognitionEngine = new SpeechRecognitionEngine();

    public static event EventHandler<SpeechRecognizedEventArgs> SpeechRecognized
    {
        add { speechRecognitionEngine.SpeechRecognized += value; }
        remove { speechRecognitionEngine.SpeechRecognized -= value; }
    }

    public static event EventHandler<RecognizeCompletedEventArgs> RecognizeCompleted
    {
        add { speechRecognitionEngine.RecognizeCompleted += value; }
        remove { speechRecognitionEngine.RecognizeCompleted -= value; }
    }

    static SpeechSynthetizerManager()
    {
        synth.SelectVoiceByHints(VoiceGender.Female);

        speechRecognitionEngine.LoadGrammar(new DictationGrammar());

        speechRecognitionEngine.SetInputToDefaultAudioDevice();
    }

    public static void Speak(string message)
    {
        synth.Speak(message);
    }

    public static void Listen()
    {
        speechRecognitionEngine.RecognizeAsync();
    }
}