【发布时间】:2016-04-21 03:38:53
【问题描述】:
我有1 exe,这与Windows form 没什么区别,它将在后台持续运行,并将watch my serial port,我有1 个事件data receive event which fires as my serial port receive data。
一旦我收到此事件中的数据,我就会将此数据传递给另一个事件处理程序saves this data in database through web api method。
但是到我的串口的数据会经常来,所以我想把这些数据独立保存到我的数据库中,这样我的数据库插入操作就不会阻塞我传入的串口数据。
这是我的代码:
void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)//Fires as my serial port receives data
{
int dataLength = _serialPort.BytesToRead;
byte[] data = new byte[dataLength];
int nbrDataRead = _serialPort.Read(data, 0, dataLength);
if (nbrDataRead == 0)
return;
// Send data to whom ever interested
if (NewSerialDataRecieved != null)
{
NewSerialDataRecieved(this, new SerialDataEventArgs(data)); //pass serial port data to new below event handler.
}
}
void _spManager_NewSerialDataRecieved(object sender, SerialDataEventArgs e) //I want this event handler to run independently so that database save operation doenst block incoming serial port data
{
if (this.InvokeRequired)
{
// Using this.Invoke causes deadlock when closing serial port, and BeginInvoke is good practice anyway.
this.BeginInvoke(new EventHandler<SerialDataEventArgs>(_spManager_NewSerialDataRecieved), new object[] { sender, e });
return;
}
//data is converted to text
string str = Encoding.ASCII.GetString(e.Data);
if (!string.IsNullOrEmpty(str))
{
//This is where i will save data to through my web api method.
RunAsync(str).Wait();
}
}
static async Task RunAsync(string data)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:33396/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var content = new StringContent(data);
var response = await client.PostAsJsonAsync<StringContent>("api/Service/Post", content);//nothing happens after this line.
}
}
Web api 控制器:
public class MyController : ApiController
{
[HttpPost]
public HttpResponseMessage Post(HttpRequestMessage request)
{
var someText = request.Content.ReadAsStringAsync().Result;
return new HttpResponseMessage() { Content = new StringContent(someText) };
}
}
但这里的问题是:
var response = await client.PostAsJsonAsync<StringContent>("api/Service/Post", content);
在此行之后没有任何事情发生,即该行上的操作块。
那么有人可以指导我吗?
【问题讨论】:
-
好的,我可以看到您再次开始使用该网站的问答进行提问,而不是通过同时与多人进行个人聊天来进行投票。
-
@Ian:有什么帮助或建议吗??
-
您可能有一个后台线程来执行此操作。当您从串行端口接收数据时,您将其放入
Queue或List或Stack- 任何适合您需要的集合类型,并且您还有background thread用于检查该项目是否存在定期收集。您使用此线程独立存储到数据库。 -
@Ian:任何例子或任何参考,我可以从哪里得到这个,或者如果你能发布代码会更好
-
没有任何适合您的特殊情况。但是如果你一点一点地搜索,我想你应该通过一个一个地查看关键字来找到人们通常是怎么做的:后台线程、队列、堆栈等......
标签: c# winforms asynchronous asp.net-web-api serial-port