我正在开发一个WPF
客户端应用程序。这个应用程序会定期将数据发送到webservice
. 当用户登录到应用程序时,我希望每 5 mts 运行一次特定方法以将数据发送到.asmx
服务。
我的问题是我是否需要使用线程或计时器。此方法执行应该在用户与应用程序交互时发生。即在此方法执行期间不阻塞 UI
有什么要找的资源吗?
我正在开发一个WPF
客户端应用程序。这个应用程序会定期将数据发送到webservice
. 当用户登录到应用程序时,我希望每 5 mts 运行一次特定方法以将数据发送到.asmx
服务。
我的问题是我是否需要使用线程或计时器。此方法执行应该在用户与应用程序交互时发生。即在此方法执行期间不阻塞 UI
有什么要找的资源吗?
我会推荐System.Threading.Tasks
使用新async/await
关键字的命名空间。
// The `onTick` method will be called periodically unless cancelled.
private static async Task RunPeriodicAsync(Action onTick,
TimeSpan dueTime,
TimeSpan interval,
CancellationToken token)
{
// Initial wait time before we begin the periodic loop.
if(dueTime > TimeSpan.Zero)
await Task.Delay(dueTime, token);
// Repeat this loop until cancelled.
while(!token.IsCancellationRequested)
{
// Call our onTick function.
onTick?.Invoke();
// Wait to repeat again.
if(interval > TimeSpan.Zero)
await Task.Delay(interval, token);
}
}
然后你会在某个地方调用这个方法:
private void Initialize()
{
var dueTime = TimeSpan.FromSeconds(5);
var interval = TimeSpan.FromSeconds(5);
// TODO: Add a CancellationTokenSource and supply the token here instead of None.
RunPeriodicAsync(OnTick, dueTime, interval, CancellationToken.None);
}
private void OnTick()
{
// TODO: Your code here
}
你需要使用Timer
类。有多个内置计时器,这取决于使用哪个计时器的要求。
System.Timers.Timer:这个更适合多线程访问。此计时器的实例是线程安全的。
System.Threading.Timer:此计时器的实例不是线程安全的。
System.Windows.Threading.DispatcherTimer -> 它将事件发送到Dispatcher
线程(并且不是多线程的)。如果您需要更新 UI,这很有用。
System.Windows.Forms.Timer -> 此计时器在 UI 线程中引发事件。这是针对 Windows 窗体优化的,不能在 WPF 中使用。
以下是有趣的阅读。
比较 .NET Framework 类库中的计时器类
如果您希望该方法在与 UI 线程不同的线程上执行,请使用System.Threading.Timer
. 否则(但我不认为这是你的情况),使用System.Windows.Threading.DispatcherTimer
.