我有一個 TreeView,其中一些節點有一個包含 IP 地址的標記屬性。
TreeView 有一個 ImageList,其中包含 3 個條目,一個紅色圓圈、一個綠色圓圈和一個橙色圓圈。
我想每 x 秒 ping 一次適當的 IP 地址(我目前有一個每分鐘發送一個“脈沖”的計時器),然后更新ImageIndex關聯節點的 以表示正確的輸出(失敗 = 紅色等)。
我堅持的是在此操作期間更新 UI 執行緒,我確信 Timer 是異步作業的,因此它不會與 UI 位于同一執行緒上。
我假設呼叫一個非異步的方法可以讓我更新 UI,但是我收到一個錯誤,我在錯誤的執行緒上編輯 UI。
這是我在 Timer 執行緒上運行的方法,它遍歷每個串列并向每個 IP 發送 ping 請求。
private void OnTimedEvent(Object source, ElapsedEventArgs e)
{
// Iterate through all root nodes
foreach(TreeNode tn in mainTree.Nodes)
{
// Iterate through all the children of the 'root' nodes
foreach(TreeNode child in tn.Nodes)
{
// Extract all nodes from these children
TreeNodeCollection myNodes = ((TreeNode)child).Nodes;
// Create ping object
System.Net.NetworkInformation.Ping pinger = new();
PingReply pingReply;
// Iterate through each of the nodes, send a ping request and then update the UI based on the result of the ping
foreach(TreeNode node in myNodes)
{
if(node.Tag != null)
{
pingReply = pinger.Send(node.Tag.ToString());
if (pingReply.Status.ToString().Contains("Success"))
{
UpdateUI(node, 0); // If successful, set the image index to show green
}
else if (pingReply.Status.ToString().Contains("Failed"))
{
UpdateUI(node, 1);
}
}
}
}
}
}
我如何嘗試更新 UI:
public static void UpdateUI(TreeNode node, int image) // int image = the index of the image 0 = green, 1 = red, 2 = orange for UI elements
{
node.ImageIndex = image;
}
計時器:
private void StartTimer()
{
aTimer = new System.Timers.Timer(60000); // Set interval to every minute
aTimer.Elapsed = OnTimedEvent;
aTimer.AutoReset = true;
aTimer.Enabled = true;
}
初始化定時器:
public Form1()
{
InitializeComponent();
StartTimer();
// Instantiate TreeViewSerializer class for persistence
TreeViewSerializer tvS = new TreeViewSerializer();
// Deserealize tree view for persistence
tvS.DeserializeTreeView(mainTree, xmlFile);
mainTree.ImageList = imageList1;
mainTree.ExpandAll();
}
如何訪問 UI 執行緒以便能夠使用從成功/失敗的 ping 回傳的值更新 UI?
uj5u.com熱心網友回復:
嘗試改變你的方法:
public static void UpdateUI(TreeNode node, int image) // int image = the index of the image 0 = green, 1 = red, 2 = orange for UI elements
{
node.ImageIndex = image;
}
至:
public static void UpdateUI(TreeNode node, int image) // int image = the index of the image 0 = green, 1 = red, 2 = orange for UI elements
{
this.Invoke(new Action(() =>
{
node.ImageIndex = image;
}));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/513485.html
標籤:C#异步计时器树视图
