我已经有一个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);
}
}
答案 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();
}
}