I have several WCF services and I want to execute methods in them at specific intervals.
For example, call Service1.DoSomeWork every 5 minutes and Service2.DoSomeWork every 10 minutes. I also want Windows client applications to be able to call the DoSomeWork methods at any time.
What is the best way to implement this?
I have complete control over the server so using Scheduled Tasks is possible but I wonder if using a Workflow in AppFabric is better or using a timer in the service itself?
Check out this post. I answered a question a while ago where the developer want to "Do something" at an interval in a windows service. I gave a pretty detailed code sample for scheduling activity within a Windows Service as recommended by other posted earlier in this thread.
how to make service act dynamically based on service running condition
I'm not familiar with AppFabric but if I were you, I will use the timer since your requirement sounds simple.
If I were your ,
I create a windows service in the server .
So that I can do anything at specific intervals....
Related
I'm using C#.
I think thats a noob question but i'm try anyway.
I have a C# project with methods: X(),Y(),Z().
I'm looking for a task scheduler that run for me every day/every hour my methods (X(),Y(),Z()) at diffrent times.
What is the best way to do that?
Just make a console application that accepts a single parameter (think myapp.exe x) that would call respective function. Then add a number of scheduled tasks to Windows Scheduler and you'll be all set.
The easiest way is to use an existing library. Scott Hanselman had a blog on this a while back http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx.
Note: the article mentions asp.net however the schedulers are mentioned can also be run through console or Windows apps.
I personally use the Fluent scheduler (https://github.com/fluentscheduler/FluentScheduler) which has now been updated to support .net core. It's easy to use, and if you have simple scheduling requirements probably the one I'd recommend.
If you want to run some code every hour, every day or any other clearly known period, then the best option is to create a console application and use Windows Task Scheduler to run this application.
If this period is unclear and depends on some logics or calculations, then the best option is using always-running Windows Services which will run your methods when necessary.
If your application is always run, you can try with reactive extensions:
Observable.Timer(TimeSpan.FromSeconds(5)).Subscribe(x=>X());
Check here for more infohttps://msdn.microsoft.com/en-us/library/hh242977(v=vs.103).aspx
I would make a windows service, and in the windows service you can call your methods with a timer check. (we did it so in our old company)
I have a very basic C# console app, which I would like to run in Azure, on a scheduled basis, like every day at 3am, for instance. I'm after some advice on the best way to implement this in Azure.
I should mention that I already have another, very similar app, for which I created a Cloud Service and Worker Role, which in essence, sits in a loop until 3AM, does some stuff then goes back to waiting. It struck me that I'm probably wasting money with this approach and that there must be a better way.
So, I did "some" research, and so far I've come-up with WebJobs and the Azure Scheduler Service but alas, neither of these A) make a lot of sense to me (at the moment, until I do more research) or B) appear to be very straight forward if all I want to do is run a simple console app once every 24 hours.
I guess I'm trying to shortcut my research because I don't want to go researching one specific method if it's not the best method for me.
So, what I'm trying to ask, in a VERY long-winded way, is....Given that I have a very simple C# Console App, what is the preferred method for "hosting" this in Azure so that I can run it in a scheduled fashion?
I believe that the easiest way is a Webjob on Website.
You can create a Worker Role and implement the scheduling using Quartz.NET.
Check out this link to see how to do it: "Using Quartz.Net to Schedule Jobs in Windows Azure Worker Roles"
I have a console service I'm currently testing. I was planning on using a timer for it to last all day, with an interval check every 30 seconds, however, it looks like alot of people don't like using timer's with a service in that fashion. Is It wise to use a timer? or is their a better method to approach it?
It's fine to have timers inside a service.
The question you should be asking yourself is whether you need your own service, or can just leverage a service that's already running timers (Task Scheduler). Or perhaps you should instead be responding to a user action.
I suspect they are trying to get you to do it using a thread based method this way, which is arguably superior as the wait method is designed to awake correctly in response the the service interface.
If you need to launch very frequently the service approach is better than a scheduled task.
My website needs to somehow do something every few minutes.
Essentially I get projects from another website. I then call one of my web pages and update.
Currently I'm making a console app for this but I'm wondering if there is a better way.
Thanks
There are super cool, open source tool exist for creating a scheduled jobs in .NET
It called Quartz.NET.
I think currently is #1 tool for that tasks.
Use windows task scheduler to run the console app your writing at the appropriate times.
Depending on what needs to be done, there are a few options.
This can be achieved by a timer in a windows service.
Using the HttpCache expiration callback feature (not recommended, it is a hack).
Use a Sql job (assuming data is changing).
Building upon #Ph0en1x answer, there already is a Stackoverlow question on how to use Quartz.Net in ASP.Net
I've got a windows service with only two methods - one private method DoWork(), and an exposed method which calls DoWork method. I want to achieve the following:
Windows service runs DoWork() method every 6 hours
An external program can also invoke the exposed method which calls DoWork() method. If the service is already running that method called from the service, DoWork() will again be invoked after the current method ends.
What's the best approach to this problem? Thanks!
An alternative approach would be to make use of a console application which can be scheduled by Windows task scheduler to run every 6 hours. In that case you don't waste resources to keep the Windows service running the entire time but only consume resources when needed.
For your second question: when you take the console app approach you can have it called by making use of Process.Start for example.
If the purpose of your application is only to run a specific task every six hours, you might be better off creating a command line application and creating a scheduled task that Windows runs automatically. Obviously, you could then manually start this application.
If you're still convinced you need a service (and honestly, from what I've seen so far, it sounds like you don't), you should look into using a Timer, but choose your timer carefully and read this article to get a better understanding of the timers built into .NET (Hint: Pay close attention to System.Timers.Timer).
To prevent reentry if another method tries to call DoWork() while the process is in the middle of performing its operation, look into using either a Mutex or a Semaphore.
there are benefits and drawbacks either way. my inclination with those options is to choose the windows service because it makes your deployment easier. scheduling things with the windows task scheduler is scriptable and can be automated for deployment to a new machine/environment, but it's still a little more nonstandard than just deploying and installing a windows service. you also need to make sure with task scheduler it is running under an account that can make the webservice call and that you aren't going to have problems with passwords expiring and your scheduled tasks suddenly not running. with a windows service, though, you need to have some sort of checking in place to make sure it is always running and that if it restarts that you don't lose hte state that lets it know when it should run next.
another option you could consider is using nservicebus sagas. sagas are really intended for more than just scheduling tasks (they persist state for workflow type processes that last for more than the duration of a single request/message), but they have a nice way of handling periodic or time-based processes (which is a big part of long running workflows). in that a saga can request that it get back a message from a timeout manager at a time it requests. using nservicebus is a bigger architectural question and probably well beyond the scope of what you are asking here, but sagas have become how i think about periodic processes and it comes with the added benefit of being able to manage some persistent state for your process (which may or may not be a concern) and gives you a reason to think about some architectural questions that perhaps you haven't considered before.
you can create a console application for your purpose. You can schedule the application to run every 6 hours. The console will have a default method called on application start. you can call your routine from this method. Hope this helps!!