我有一个winform应用程序需要使用web服务。Web服务检查数据库中的任何更改。如果数据库中有任何更改,应该通知winform应用程序,并相应地执行一些任务。我怎么做呢?
我想到在我的winform应用程序中使用定时器,然后说每5分钟连接到一个web服务,并检查是否在数据库中进行了新的更改。还有别的办法吗?
更新:
我在这里张贴的代码基础上的答案:
类performtask{
public static bool checkIfInProgress { get; set; }
public static void InitializeWebService()
{
try
{
Timer = new System.Timers.Timer(2000);
Timer.Elapsed += OnTimedEvent;
Timer.Enabled = true;
}
}
private static void callService()
{
using (var service = new WebServiceSoapClient())
{
checkIfInProgress = true;
task1();
task2();
popMessage();
checkIfInProgress = false;
}
}
private static void OnTimedEvent(Object source, ElapsedEventArgs e)
{
if (checkIfInProgress == false)
{
callService();
}
}
private static void PpopMessage()
{
var form = new Form
{
StartPosition = FormStartPosition.Manual,
ShowInTaskbar = false,
Text = "Message",
Size = new Size(500, 200),
};
var screen = Screen.FromPoint(form.Location);
Label lblText = new Label();
lblText.Text ="Test Text";
lblText.Dock = DockStyle.Fill;
lblText.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
form.MaximizeBox = false;
form.Controls.Add(lblText);
form.Location = new Point(screen.WorkingArea.Right - form.Width, screen.WorkingArea.Bottom - form.Height);
form.Show();
}
现在一切都很好,除了一个任务,即popMessage(代码片段在顶部)。这里的表单是打开的,但它似乎总是在加载。在使用之前,它曾经工作得很好。我该如何处理呢?
这是唯一的方法,特别是如果web服务不是基于wcf的,或者如果你无法修改它。
如果你正在使用定时器,只要确保你使用system . timer . timer并遵循这里的说明,以便在UI线程上执行Elapsed
处理程序。此外,当计时器滴答作响时,您可能应该生成一个发出服务调用的工作线程(或Task,或等待异步方法)。当服务调用正在进行时,你不希望你的UI被阻塞。
如果您可以控制web服务,那么您可能想要探索WCF双工服务,它允许您从服务内部回调客户端。
SignalR允许您实现Web服务来实时地做这件事(不需要计时器或更新之间的延迟)。它允许你在客户端和服务器之间建立一个持久的连接,然后服务器可以在任何时候使用传输堆栈向客户端发送消息;WebSockets,服务器发送事件,永久帧和长轮询)基于可用的支持。
您可以使用SignalR建立连接,并在服务器上发生某些事情(例如您提到的数据库更改)时向需要通知的所有客户端广播。如:
Clients.All.notifyDatabaseChanged(args);