新人對一些概念理解有限。之前寫了一個產測已經在使用了。想逐步對原程式進行優化,讓邏輯構架更為清晰。現使用了ref引數重寫一個方法,發現如果里面有異步執行緒則會提示出錯。請問如何規避?
同步執行緒運行速度太慢,暫不考慮
謝謝。
private void test(ref int test)
{
................
Task.Run(() =>
{
if (test < 1)
{
sect_disp(0);
................................
uj5u.com熱心網友回復:
在異步、匿名方法(函式)、lambda 運算式等場景不允許使用 ref 或 out 傳出引數,你需要修改代碼避免此種情況發生。要么不使用 ref 或 out,要么不要使用異步。uj5u.com熱心網友回復:
不支持的,想out 也不行。uj5u.com熱心網友回復:
那么請問你為啥要ref呢?外面有人還需要知道這個ref么?
如果外面想知道他,可以 task<int>,可以委托回傳,可以IProcess<int> 通知
uj5u.com熱心網友回復:
我大概明白你意思了。你別用 Task.Run
換成Task.Factory.StartNew(Action,object) 這個多載方法
把引數傳進去。
如果需要回傳值
改成Task.Factory.StartNew<int>((x)=>{return (int)x+1;},object)
uj5u.com熱心網友回復:
之前因為需要復測的功能,我按照大佬的思路,沒有使用ref引數之前,是如下這樣寫的:
1,public partial class Form1 : Form內,定義了一個全域變數為int passednr。該變數記錄了DUT已經通過的測驗專案。
2. 封裝了一個測驗方法 private void test(int test)。內有21個測驗專案,如果傳入test=0,則代表從第一項開始測驗,test>0(例如test=5,表示之前已經測驗通過5項,從第6項開始測驗)則代表復測。 測驗專案是以一系列telnet相關的指令應答驗證。用異步方式實作。
3. 封裝了如下的方法,在第i項通過/或者NG的時候呼叫。邏輯是如果某項測驗通過,passednr需要做+1操作。(未通過則退出)。
按照這個邏輯,如果把ref加進來,感覺變數少會一些,邏輯會更清晰。
public void Test_Ok(int i)
{
passednr++;
this.Invoke(new EventHandler(delegate
{
listView1.Items[i].ForeColor = Color.Green;
}));
}
public void Test_Ng(int i)
{
locallog.WriteLog("“" + checklist[i] + "”" + "測驗失敗", LogName);
this.Invoke(new EventHandler(delegate
{
listView1.Items[i].ForeColor = Color.Red;
label4.Text = "NG";
label4.ForeColor = Color.Red;
textBox2.Enabled = true;
textBox2.Focus();
}));
uj5u.com熱心網友回復:
可以考慮用委托來實作 通過回呼函式來獲取回傳值uj5u.com熱心網友回復:
哦,你需要知道最終處理位置這個采用
Task<int> 處理方法()
{
}
uj5u.com熱心網友回復:
ps:這種順序執行的東西,通常采用職責鏈或者管道模式你需要保存的是背景關系,相當于任何一個鏈路環節失敗,回傳當時的背景關系環境,序列化保存,已備下次呼叫恢復背景關系環境
現在又被吹上天的asp.net core,采用的就是管道模式,所謂的神乎其神的Middleware,短路 Middleware,熔斷Middleware,就是這種其實原本其實本來沒啥東西的“神話技術”
uj5u.com熱心網友回復:
https://www.cnblogs.com/stulzq/p/7760648.html神話asp.net core篇
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/93464.html
標籤:C#
上一篇:C# 物件被占用無法呼叫
