我有一個問題,我有一些值需要每 5 秒更新一次。但在此期間,我也必須更新我的新聞源。
如何運行我的新聞源?:我的新聞源將在回圈中運行,將文本向左移動。
問題:我需要以某種方式在新聞源也在運行的同時運行所有其他代碼。但我想不出辦法做到這一點。我不能將我的新聞提要更新程式放在我的主回圈中,因為它也會與其他人一起更新,從而導致新聞提要竊聽。
代碼:
public partial class Form1 : Form
{
ServiceReference1.monitorSoapClient ds = new ServiceReference1.monitorSoapClient();
public Form1()
{
InitializeComponent();
}
private void lblTempOut_Click(object sender, EventArgs e)
{
}
private async void btnUpdate_Click(object sender, EventArgs e)
{
int i = 0;
do
{
lblTempOut.Text = ds.OutdoorTemp().ToString("N2") " °C";
lblInsideTemp.Text = ds.StockTemp().ToString("N2") " °C";
lblHumitidyOutside.Text = ds.OutdoorHumidity().ToString("N2") " %";
lblStockHumitidy.Text = ds.StockHumidity().ToString("N2") " %";
{
listBoxMinItem.Items.Clear();
ds.StockItemsUnderMin().ForEach(item =>
{
listBoxMinItem.Items.Add(item);
});
}
{
listBoxMostSold.Items.Clear();
ds.StockItemsMostSold().ForEach(item =>
{
listBoxMostSold.Items.Add(item);
});
}
{
ListBoxOverMax.Items.Clear();
ds.StockItemsUnderMin().ForEach(item =>
{
ListBoxOverMax.Items.Add(item);
});
}
TimeZoneInfo timeZoneCopenhagen = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time");
DateTime CEST = DateTime.UtcNow;
DateTime ConvertedTimeCEST = TimeZoneInfo.ConvertTimeFromUtc(CEST, timeZoneCopenhagen);
lblTimeCopenhagen.Text = ConvertedTimeCEST.ToString();
TimeZoneInfo timeZoneLondon = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
DateTime GMT = DateTime.UtcNow;
DateTime ConvertedTimeGMT = TimeZoneInfo.ConvertTimeFromUtc(GMT, timeZoneLondon);
lblTimeLondon.Text = ConvertedTimeGMT.ToString();
TimeZoneInfo timeZoneSST = TimeZoneInfo.FindSystemTimeZoneById("Singapore Standard Time");
DateTime SST = DateTime.UtcNow;
DateTime ConvertedTimeSST = TimeZoneInfo.ConvertTimeFromUtc(SST, timeZoneSST);
lblTimeSingapore.Text = ConvertedTimeSST.ToString();
string newsFeedUrl = @"https://nordjyske.dk/rss/nyheder";
XmlReader reader = XmlReader.Create(newsFeedUrl);
SyndicationFeed syndFeed = SyndicationFeed.Load(reader);
reader.Close();
foreach (SyndicationItem item in syndFeed.Items)
{
newsFeed.Text = item.Title.Text " ";
}
await Task.Delay(5000);
} while (i == 0);
Move();
}
private void ResetNewsPosition()
{
newsFeed.Left = newsContainer.Width;
}
private async void Move()
{
while (true)
{
ResetNewsPosition();
while (newsFeed.Location.X newsFeed.Width >= 0)
{
newsFeed.Left -= 1;
await Task.Delay(10);
}
}
}
如果有人有任何建議,請告訴我:)
uj5u.com熱心網友回復:
您可以通過使用Timers 來做到這一點。當撰寫UI代碼,你應該不會是超過幾百毫秒需要更長的時間寫回圈來完成。如果您的回圈包含 aTask.Delay或 a Thread.Sleep,則表明您應該改用計時器。Task.Delay將在內部使用計時器,在某些情況下,如果您想要一個短暫的延遲,使用起來會很方便,但是每當您做出諸如“我想每隔 Y 秒運行一次”之類的陳述句時,直接使用計時器可能會更好.
這使您可以交錯不同的功能,即您可以在單個執行緒上一個接一個地運行每個功能,可能以不同的頻率運行。例如,將您的移動功能重寫為
private void MoveNewsPos(){
newsFeed.Left -= 1;
if(newsFeed.Location.X newsFeed.Width < 0)
ResetNewsPosition();
}
并從一個間隔為 10 毫秒的計時器中呼叫它。
另一種選擇是使用多執行緒。但這在您做計算成本高的事情時非常有用。當大部分任務包括更新 UI 時,它根本沒有用。
為了完整性,還有異步操作,在執行 IO 作業時最有用,以允許 UI 執行緒在等待來自磁盤或網路的結果時執行其他操作。
另請參閱為什么有 5 個用于不同型別計時器的計時器類。
uj5u.com熱心網友回復:
要每 5 秒啟動一次任務,我的建議是使用System.Timers.Timer類。它是一個組件,因此必須在處理表單時處理它。最好的方法是將它添加到表單的屬性中components。
private Timer CreateUpdateTimer()
{
TimeSpan timerTime = TimeSpan.FromSeconds(5);
Timer timer = new Timer(timerTime.TotalMilliSeconds);
// Hook up the Elapsed event for the timer.
timer.Elapsed = OnTimedEvent;
timer.AutoReset = true;
timer.Enabled = true;
return timer;
}
考慮創建一個以 TimeoutTime 作為 TimeSpan 引數的程序
// will be called every 5 seconds:
private static void OnTimedEvent(Object source, ElapsedEventArgs e)
{
this.UpdateValues(); // the procedure that updates your values
}
在您的建構式中:
public Form1()
{
InitializeComponent();
this.components.Add(this.CreateUpdateTimer());
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/404455.html
標籤:
上一篇:如何強制CompletableFuture.thenApply()在運行前一階段的同一執行緒上運行?
下一篇:在需要時解決承諾
