菜鳥問下,和一個設備進行tcp通信,我發送指令給設備后,設備會回復對應指令。我現在希望在發送指令后等待1s,如果沒收到設備的回復,就彈出視窗提示,要怎么添加代碼呢
private void Newopenbutton_Click(object sender, EventArgs e)
{
singleclient = new RSUTcpClient(serverip,port);
singleclient.ReceviedData += Singleclient_ReceviedData;
singleclient.Send(order); //發送指令
}
private void Singleclient_ReceviedData(object sender, NetEventArgs e)
{
。。。。。。。。獲取設備回傳的資訊。。。。
}
uj5u.com熱心網友回復:
加個序列號
uj5u.com熱心網友回復:
最開始我是這樣寫的,但是明明收到回復了,還是會彈出error,這是為什么private bool t=false;
private void Newopenbutton_Click(object sender, EventArgs e)
{
singleclient = new RSUTcpClient(serverip,port);
singleclient.ReceviedData += Singleclient_ReceviedData;
singleclient.Send(order); //發送指令
thread.sleep(1000);
if(t==false)
{
messagebox.show("error");
}
}
private void Singleclient_ReceviedData(object sender, NetEventArgs e)
{
t=true;
。。。。。。。。獲取設備回傳的資訊。。。。
}
uj5u.com熱心網友回復:
老哥能詳細些嗎,還有就是為什么按照我樓下那樣寫不行呢
uj5u.com熱心網友回復:
最近這種問題簡直不要太多好吧,異步任務,異步信號量----------手段也不要太多
前幾天有人說函式式垃圾,都混成一坨。俺們說,你們現在的問題就是不接受函式式,把一個邏輯散的到處都是,結果接不回來了
我也不折騰你們不喜歡看的東西,你們愿意那樣就那樣把。用你們喜歡的,能接受的方式玩
偽代碼:
信號量
singleclient = new RSUTcpClient(serverip,port);
singleclient.ReceviedData +=(send,e)=>{
//如果接收到,釋放信號量
}
信號量.waitOne(超時時間) 占用信號量
singleclient.Send(order); //發送指令
信號量.waitOne() // 他會堵在在里等待上一次釋放,當然超時了也釋放
//因為不想用你們不喜歡方式,所以你自己判定是收到釋放的,還是超時釋放的
最后全部釋放信號量
因為程序是異步,建議你最好使用異步信號量-----------這里不談信號量不高級,你們不接收微軟更簡化的版本,你們只喜歡玩微軟內部實作的高級玩意,美其名曰“技術”
uj5u.com熱心網友回復:
老哥,這不是高不高級,接不接受的問題,萌新瑟瑟發抖啊。。
uj5u.com熱心網友回復:
下面才是正常的“低級”做法,而不是“高級”玩法模擬,button3啟動一個異步任務,10秒內收到button4事件認為正常結束,否則視為超時
private async void button3_Click(object sender, EventArgs e)
{
try
{
CancellationTokenSource cts=new CancellationTokenSource(TimeSpan.FromSeconds(10));
await wait4buttclck(cts.Token);
MessageBox.Show("正常等到button4的事件");
}
catch (Exception exception)
{
MessageBox.Show("超時或其他例外");
}
}
Task<bool> wait4buttclck(CancellationToken token)
{
TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
Task.Factory.StartNew(() =>
{
this.button4.Click += (send, e) => { tcs.TrySetResult(true); };
},token);
token.Register(() => { tcs.TrySetException(new TimeoutException()); });
return tcs.Task;
}
}
uj5u.com熱心網友回復:
修改一下,避免事件掛接泄漏。任務結束移除事件掛接private async void button3_Click(object sender, EventArgs e)
{
try
{
CancellationTokenSource cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));
await wait4buttclck(cts.Token);
MessageBox.Show("正常等到button4的事件");
}
catch (Exception exception)
{
MessageBox.Show("超時或其他例外");
}
}
Task<bool> wait4buttclck(CancellationToken token)
{
TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
EventHandler handler = (send, e) =>
{
tcs.TrySetResult(true);
};
Task.Factory.StartNew(() => { this.button4.Click += handler; }, token);
tcs.Task.ContinueWith(p =>
{
this.button4.Click -= handler;
});
token.Register(() =>
{
tcs.TrySetException(new TimeoutException());
});
return tcs.Task;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/80440.html
標籤:C#
上一篇:c#ui設定
下一篇:求助 !!! C# datagridview 系結了資料源 界面前臺能顯示值 后端代碼想取值的時候隨便哪個cell都是null
