Hacker News new | past | comments | ask | show | jobs | submit login
Open Source .NET libraries that make your life easier (thomasvm.github.io)
305 points by thomasvm on Apr 10, 2015 | hide | past | web | favorite | 114 comments

To add to the author's list:

* I seem to install Json.net in every .NET project I create (json serializer - thanks James Newton-King!)

* NLog for logging. It's fantastic.

* Dapper is also excellent (Micro ORM) (and anything written by Marc Gravell is generally top-notch - see protobuf-net, miniprofiler, StackExchange.Redis)

* Automapper, to avoid writing boilerplate code to convert between similarly shaped types (E.G. DTOs to DB models).

* RestSharp makes talking to RESTful apis easier.

* Microsoft's Unity is a great IOC framework, although most people seem to use NInject.

Excellent list. Another addition I would make is another contribution from Stack Exchange, this time from Kevin Montrose. It's a high-performance JSON serializer/deserializer called Jil. https://github.com/kevin-montrose/Jil

I've been using it on most of my newer projects this year and I have to say I much prefer it over the (still excellent) Json.net.

> * Microsoft's Unity is a great IOC framework, although most people seem to use NInject

Autofac is my favorite. Once built, containers are immutable, there is deterministic disposal of components in 'lifetime scopes', and delegate factories make it much easier to instantiate classes with a mixture of services and data.

Thanks for these. Adding a couple others:

* EPPlus for reading or creating Excel spreadsheets without using Excel (such as on a server). http://epplus.codeplex.com/

* RTFConverter for parsing RTF. http://www.codeproject.com/Articles/27431/Writing-Your-Own-R...

These are good enough to drive the decision to use C#/.NET for projects needing these capabilities.

I found SpreadsheetLight much more performant than EPPlus. http://spreadsheetlight.com/download/

I prefer DoddleReport for creating reports from a dynamic source to Excel, PDF, OpenExcell, txt or csv :)

They also have a great MVC integration

Dapper is a really awesome library when you want to write complex queries (full of table hints, output clauses, merges and other advanced stuff), but don't want to write enormous amount of code for adding parameters and reading result sets.

Personally, I think it's great even for crud...It's an order of magnitude faster than things like EF/LINQ2SQL

I've also used BLToolkit, and it is pretty fast too, plus it has Linq support to build strongly-typed queries that sometimes better than raw SQL queries. But when it comes to table hints, Linq and other stuff does not help. So, it always depends :)

BLToolkit and the replacement (linq2db) are great. Excellent performance and it has some excellent developers contributing.

Agreed. And really it's pretty simple to get it working and start using it even for straight crud - much easier than EF or other heavy ORMs, I think.

> RestSharp makes talking to RESTful apis easier.

Another interesting library for doing REST APIs is Refit: https://github.com/paulcbetts/refit

Damn, thanks for pointing me in that direction. It's exactly what I've been looking for.

Technically, I implemented some of that stuff myself because I needed REST client that would work with PCLs and be a bit 'nicer' to use than just juggling strings/routes everywhere, so using annotations and wrapping Microsoft's HttpClient was obvious and relatively easy way out.

Anyway, I'll probably just phase out my own solution and start using the library.


After checking it out, RefitStubs.cs file seems a little bit clunky, but the library as a whole looks solid enough. I'll look further into it.

RefitStubs is necessary because on certain platforms (iOS, WinRT), you cannot JIT and therefore can't use something like Castle Core to generate a class

I figured as much. Unfortunately there's no Emit for AOT where you could do something like: https://github.com/jonwagner/Insight.Database/blob/master/In...

On the other hand, I wonder if it wouldn't be easier to ship a T4 template? I know for sure that would integrate with VS (both the IDE and build process) without any issues, not sure about Xamarin Studio...

I'd add ImageResizer for resizing images ( and in MVC resizing them in a restfull way...). You can also localcache them or cache external images (resized). You can also store them in the cloud and add effects to the images.

Many things are possible : http://imageresizing.net/

It isn't possible in Asp.Net 5 (vNext) though :( - because of the cross platform integration.

Also, https://github.com/jamietre/CsQuery is pretty nice for parsing webpages and using CSS Selectors (jquery style)

With CsQuery, you could use aBot ( https://github.com/sjdirect/abot ) for crawling ;)

Was going to post Dapper, Automapper and RestSharp myself.

I use ELMAH for logging but I'll give NLog a look!

I also can recommend StackExchange Exceptional and Opserver from the StackExchange crew for logging: https://github.com/opserver/Opserver

Would give a headsup for Elmah and the MVC integration... It's pretty easy and awesome.

> NLog for logging. It's fantastic.

I use NLog, but I access it through the Common.Logging facade. This is helpful when I need to bolt my code into an environment where NLog kind of sucks, like Xamarin.Android.

If you're in a position to use it, I much prefer Anotar with Fody https://github.com/Fody/Anotar

Commons.Logging always felt clunky in comparison.

I prefer Timber myself https://github.com/cocowalla/Timber

In particular, it makes logging to the Windows event log much easier

How does Automapper compare to Entity Framework?

We use Elmah instead of Nlog, which is also fine. Looks like NLog is a bit more flexible than Elmah is. But Elmah is KISS which is nice.

I think you're asking about Dapper (ORM) which could be compared to Entity Framework. The two major things to think about if comparing would be simplicity and speed. Dapper is simple to setup and use. It uses standard SQL and it's very fast. On the other hand, this is not a fair comparison. EF is has many more features and options. Use the right tool for the right job depending on requirements. Elmah and NLog are not apples to apples either. Elmah make dealing with "Unhandled" exceptions very simple. Nlog is for application logging (Trace, Info) and exception management (A try catch scenario).

In fact it is not uncommon for me to use both Dapper and EF on the same project. Usually I'll use Dapper for the query/reporting side and EF for the domain model/update side. (Used to use nHibernate, but it seems to have really stagnated unfortunately)

Even then, for query building I found EF (or any LINQ provider for SQL) to be easier solution than string concatenation. Well, at least for relatively simple queries with pagination and stuff. For filters, Dynamic.Linq would be helpful here.

On the other side, if you need to work extensively with stored procedures or you have complicated or custom SQL to run, Dapper (or Insight.Database - https://github.com/jonwagner/Insight.Database, a library which I found really nice to use) will be your best friend.

It's true. What I really would like is a micro-orm like Dapper with support for using LINQ to dynamically build queries. But I suppose this is essentially EF with AsNoTracking, which I have yet to play around with and test performance wise.

AsNoTracking makes the materialization indeed faster, but EF always has a cost associated with it, both for initial use (set up of the context etc, which is noticeable) as well as every other query after that (expression tree parsing etc, not as noticeable especially for recurring queries).

I hope it's one of the pain points they will address and solve during their rewrite to EF7 at one point.

That being said, my opinion is that unless you have really strict performance and/or latency requirements, EF should be good enough. At least for simpler queries and in 'longer-running' applications :)

My testing showed that AsNoTracking is faster than dapper. But indeed the tests were purely focused on materialization and not query parsing: linq query parsing takes a lot of time, so with lots of predicates etc. you'll see much slower performance with EF compared to other ORMs with query systems other than Linq (except NHibernate, that's slow regardless)

See: https://github.com/FransBouma/RawDataAccessBencher

Entity Framework isn't really similar to any of the things I listed. I tried to only include components you might use as part of a larger system, rather than technology stack choices.

Dapper distills the converting database rows to objects. It's a micro ORM, which means it doesn't try to abstract SQL like a monolithic ORM (NHibernate, EntityFramework) would do. Example:

        public TagModel GetTag(long id)
            using (var conn = m_connector.GetConnection())
                return conn.Query<TagModel>("SELECT TOP 1 * FROM Tags WHERE Id = @Id", new { Id = id }).FirstOrDefault();

AutoMapper does not really compare to EF. AutoMapper is used to copy automatically data between two objects of different classes (like a.UtilisateurName = b.Utilisateur.Name). It uses Reflection for that. I will try to link automatically properties by their names. The two classes do not have to have the same format. It works if one the classes is the flattened version of the other.

It might not be really clear, sorry. Try to look on their website https://github.com/AutoMapper/AutoMapper/wiki/Getting-starte....

Automapper and Entity Framework are two absolutely different things. The first one in a mappings library and the other one is a full ORM.

Automapper basically allows you to convert a DB Model to a DTO or a ViewModel.

Never understood the point of Automapper when you can write explicit/implicit user defined typed conversions in C#.

could you elaborate a bit more on that?


Doesn't completely replace automapper

Some that I build (and use):

* albacore for cross platform builds with ruby https://github.com/Albacore/albacore/ C++.Net, VB, C#, F#

* suave.io http://suave.io F#

* logary for structured logging and metrics and health-checks http://logary.github.io/ C# and F#

* Chiron for F# JSON parsing

* logibit.hawk for F# API Hawk verification https://github.com/logibit/logibit.hawk/

* Http.fs instead of RestSharp for F#

* FsSql for ADO.Net interaction

Some additional ones I haven't seen mentioned so far:

* FluentValidation: excellent validation library, keeps validation rules grouped together and easy to keep track of - https://github.com/JeremySkinner/FluentValidation

* AutoFixture: great for the "Arrange" phase of unit tests. Populates object graphs with test data, highly customizable. There's a bit of a learning curve. Pairs nicely with xUnit but can be used with any TDD library - https://github.com/AutoFixture/AutoFixture

* Shouldly: a different approach to unit test assertions using "Should" that I find more readable. Also had friendlier error messages when assertions failed - https://github.com/shouldly/shouldly

Shameless plug of my own library:

* Regextra: aims to solve some common regex related scenarios. Features a Passphrase Regex Builder to generate a pattern for passphrase criteria, and also supports named templates and a few utility methods - https://github.com/amageed/Regextra

I've been considering abandoning AutoFixture for FsCheck.

Partially because that's what AutoFixture's maintainer seems to have done recently. Mostly because FsCheck adds a number of additional features such as automatically reducing failing test cases down to the the simplest failing example it can find that make it very powerful for more complex cases.

One downside, though, is that the C# interfaces are somewhat neglected. It's really a lot nicer to use from F#.


In addition to the great ones already listed on the link and in the comments here, I'd like to list 2 of my favorites:

* Simple.Data: https://github.com/markrendle/Simple.Data , the smallest and simplest ORM you'll ever use.

* Hyperletter: https://github.com/Jiddler/Hyperletter , a very easy way to do inter-process communication. Great for writing distributed software over http, but can be just as useful locally.

Check out Akka.Net - http://getakka.net/

This is a port of the Akka framework from Java to the .Net platform. It's an actor model framework which works incredibly well for building highly concurrent and distributed applications. They just hit version 1.0 and are out of beta and are backed by a commercial company Petabridge.

Highly recommended.

I used to use NLog for logging until I've discovered Serilog ( http://serilog.net/ ) - simple .NET logging with fully-structured events.

Serilog is awesome. Log context is awesome.

I'm a bit torn because ETW is prob the way forward for us but it doesn't have a good ecosystem currently and offers nothing like log context... Though some higher order function magics might help.

Serilog to me is a much more modern logging solution. Allows us to pipe logs to table storage/sqlserver/loggly/logentries/docdb/azure event hub ... its the backbone of our app - really just awesome

would you be interested in sharing your setup or pointers toward a good solution with Serilog? I found that something other than a basic setup requires a good chuck of effort to get going. For example, configuration (all code) and IOC.

Humanizer Fantastic string, number, and datetime manipulation library http://www.nuget.org/packages/Humanizer/

Units.Net I love this for measurement and weight conversions http://www.nuget.org/packages/UnitsNet/

And, of course, a shameless plug of my own library Fibber An indiscriminate data generator that will generate random data for all properties in a given class based on the property's type vs. its name https://github.com/Schandlich/Fibber http://www.nuget.org/packages/Fibber/

Fibber looks great, how does it compare to AutoFixture?


I can honestly say I had not heard about AutoFixture until today. Haha.

They look similar. The only difference I can really see is that I prefer my syntax a little better for type fixtures:

.For<string>("whatever"); vs fixture.TypeMappings[typeof(string)] = s => "whatever";

I also allow a seed to be set for ensure "consistent random data".

But there are some features of AutoFixture that I definitely want to look at.

I created Fibber more for mocking data sources when I was creating Web Api services; and AutoPoco was just too much configuration. Unit testing was not the main purpose of the library.

Surprised no one has mentioned Nancy: https://github.com/NancyFx/Nancy I can't imagine building APIs without it now.

I find NancyFX really interesting, but I can't really see a reason to stray away from Web API2 besides Mono support. Any specific reasons you prefer Nancy?

I've been wondering this, too. I've been using MVC since version 2 and am very comfortable with it and Web API, but a startup I've been doing side-work for is using Nancy. Nancy does seem lighter weight, and includes TinyIoC for dependency injection out-of-the-box, but I too don't see a real killer use case for Nancy.

It's nice to serve webapi's and serverside pages from the same class. I like the content negotiation in Nancy. Also the built-in testing features are nice, it is easy to test views too.

Mono support is important for us and I prefer the syntax. It's also handy to be able to serve up ancillary pages like documentation alongside the API.

I agree with you, but maybe because it's lightweight? It's pretty damn simple.

Here's another one that will make your life easier: https://github.com/adamcaudill/libsodium-net

Now you have no excuses for rolling your own broken crypto.

This (article + HN comments) will be extremely handy for me in the future (I'm a .NET dev).

Knowing that'll need some of those libraries later I decided to compile into a list here: https://github.com/tallesl/.NET-libraries

With .NET going open source, I'd like to see what is out there for web services. Are there any linux-compatible .NET web servers/routers that I can use that have a similar feature set and performance to the Spray/Scala stack? C# or F#, but preferably F#. I've tried a couple (suave, nancy), but some simple benchmarks showed they were about half as scalable as spray.

Were those simple benchmarks running on Mono? .Net is certainly going open-source, but it hasn't arrived yet. It might be worth rerunning those benchmarks once .Net proper is available for *nix.

Yes they were on the latest version of Mono, which in my experience outside of web programming is just as fast as the JVM. I think the gap has more to do with the libraries than the VM, but I'd be willing to wait it out to see. I'm not migrating soon anyway...although it would be nice to know how far out it is.

Lately I checked the Perlin noise performance test that was linked to on reddit (http://www.reddit.com/r/programming/comments/31mzu1/go_vs_ru...).


Benchmark: C# (Mono) - 1052.041381 ms, Java - 597.9874 ms

My machine: C# (Windows) - ~475 ms, Java - ~552 ms

Even considering that Mono is using maximum precision available (so instead of floats it's using doubles), when I swapped all floats to doubles it still ran in ~525 ms on my box.

So while Mono might be 'getting there', sometimes it's still lagging behind. It's just something to keep in mind :)

+1 on this - getting ASP.NET working really well on Linux/Mac, with first-party framework and VM, is the main goal for all of the in-flight .NET Core CLR open source stuff. That + console apps are literally all that's going to be supported, at least initially. Microsoft cares a lot about making this good.

In this case half as scalable really doesn't clarify what you mean. If I can through twice as many servers at the problem and it runs as fast, then to me it's just as scalable.

* Do you mean half the performance per connection? * Throughput falls off at half the connections? * Will start trailing off at half the number of servers?

In my mind there's a cost to development time, architecture thinking as well as developer cost to maintain/adapt/enhance. If you can throw more runtime resources at a problem, and that costs you a fraction of a man-year of labor over the next five years vs. taking longer to develop, or fewer developers skilled enough to make modifications, these are real concerns. It really depends on context.

TopShelf looks interesting, I have written quite a few Windows services over the years and there have always been lots of gaps in the MS offering.

I've been using TopShelf in production settings for a few years now and have been more than pleased. We have yet to discover any issues related to using the library. And new developers find it extremely easy to pick up.

I've just rolled out a service using TopShelf having not used it previously. It really does simplify things. The best bit for me is being able to just hit F5 and having the thing run as a console application. No need to manually attach to processes for debugging.

This technique lets you debug your service as if it were a console app - just pass in -a on the command line.

In your Main method:

            if (args.Length > 0 && args[0] == "-a")
                // Running as an application
                MyService ms = new MyService();
                Console.WriteLine("Press Enter to Stop");
            } else {
                // Running as a service
                ServiceBase[] servicesToRun = { new MyService() };
And in the MyService class that derives from ServiceBase:

        protected override void OnStart(string[] args)

        protected override void OnStop()

        internal void DoStart()
            // Start your service thread here

        internal void DoStop()
            // Tell your service thread to stop here

I use something similar to debug a WCF project:

  private static void Main()
    var serviceHandler = new ServiceHandler();

    if (Environment.UserInteractive)
      Console.WriteLine("Service started! Press <ENTER> to terminate service.");
      Console.WriteLine("Service stopped!");

I normally use this (simple) technique: http://stackoverflow.com/a/126016

Once you use TopShelf you'll never go back! Honestly, debugging Windows Services are simple using TS.

It's definitely superior to hand rolling Windows services. We have something like 6 or 7 TopShelf-based services, a couple of which are self-hosted WebAPI endpoints. No problems or gotchas that I can remember, aside from slightly marginal documentation last time I looked.

Topshelf's documentation does need some more TLC -- if there's something specific you thought was lacking I can take a look at updating it.

I'm glad to hear you're getting value out of it! Last place I was at, we had about 30 distinct services running. It was a huge bonus to have Topshelf.

I think my problem was using the Custom Service style, rather than inheriting from ServiceControl. There are a number of ways to interact with the HostConfiguration.Service<T>() method and its overloads, but there's only one tiny section in the documentation.

TBH, I think you might want to deprecate that whole way of using TopShelf. Using ServiceControl is much much easier and better documented. I think if one wants to keep TopShelf out of their core code, it's easier to create a separate "ServiceWrapper" project that has a ServiceControl subclass and calls into your other code, rather than using the HostControl.Service() style.

I've recently discovered Linq2Db. Works great for CRUD in conjunction with Dapper. https://github.com/linq2db/linq2db It also comes with handy T4 templates to generate models.

I've been using it for long time now. Very fast, light, and stable. Thanks Igor!!

See: https://github.com/Microsoft/dotnet

This is an extensive list of (non-MS) OSS libs and tools for .NET , complete with descriptions. The URL might suggest this is the .NET source, it's a set of text documents with URLs to OSS libs/tools.

It's been years since I worked in C#, and now I want to try out most of these libraries. I'm genuinely impressed by the ecosystem out there.

One of my recent favorite libraries lately is DynamicData [1] which is Rx for collections. It allows you to use LINQ operators to create lots of different collections from a single "observable cache". An example from the github page:

    var list = new ObservableCollectionExtended<TradeProxy>();
    var myoperation = somedynamicdatasource
                        .Filter(trade=>trade.Status == TradeStatus.Live) 
                        .Transform(trade => new TradeProxy(trade))
                        .Sort(SortExpressionComparer<TradeProxy>.Descending(t => t.Timestamp))
This takes the collection at somedynamicdatasource, transforms the contents to TradeProxy objects, sorts it, and binds it to list. Any time that an object is added or removed in somedynamicdatasource, list will be updated to match. This library has over 50 operators including dynamic filters (changing the filter causes the bound collection to be reevaluated), boolean operators (only update the resulting collection if the object is in both source collections or only one), etc.

[1] https://github.com/RolandPheasant/DynamicData

I'd like to add one that's great for turning the web into a query-able database: HtmlAgilityPack. HtmlAgilityPack + Linq is amazing.

For working with HTML (parsing, extracting), I'd like to add HtmlTypeProvider from F# Data as one of the options. :)

HtmlAgilityPack saved my skin once.

I have to say that for someone starting to transition to .net, this is a great post. Posts like these are what I expect from the Ruby/Python/Node/PHP communities but the lack of them and lack of good learning opportunities had made me hesitant to use .net in the past. Thanks a lot, you've just made me feel a whole lot better about the .net community as a whole.

Please visit regularly asp.net\community , codeplex.com . There is ton of stuff there

Fasterflect, must-have reflection library https://fasterflect.codeplex.com

Insight.Database, in my opinion much better than Dapper https://github.com/jonwagner/Insight.Database

One of my must haves that I'd definitely recommend is T4MVC[0]

    T4MVC is a T4 template for ASP.NET MVC apps that creates strongly typed helpers that eliminate the use of literal strings in many places.
[0]: https://github.com/T4MVC/T4MVC

Wow. I have suffered so much without it, unnecessarily! How can this not be built into the ASP.NET MVC framework?

Compile-type safety for literal strings! Amazing!

Few more:

* ServiceStack - full-featured Services Framework https://github.com/ServiceStack/ServiceStack

* ServiceStack.OrmLite - Fast, Simple, Typed ORM for .NET https://github.com/ServiceStack/ServiceStack.OrmLite

* BCrypt.Net - A .Net port of jBCrypt implemented in C# http://bcrypt.codeplex.com/

* Stripe.net - .net api for Stripe https://github.com/jaymedavis/stripe.net

* TuesPechkin - .NET Wrapper for the wkhtmltopdf library (to generate PDFs) https://github.com/tuespetre/TuesPechkin

My personal list:

* RestfulRouting http://restfulrouting.com/ - must have

* Turbolinks for .net https://github.com/kazimanzurrashid/aspnetmvcturbolinks

* Flash messages for .net https://github.com/khalidabuhakmeh/MvcFlash

* Fixie, unit testing https://github.com/fixie/fixie

* Entity Framework testing tool http://effort.codeplex.com/

* Automapper, AutoFixture, FluentValidation - mentioned already

* StructureMap - IoC

Does anyone have recommendations for frameworks or libraries for implementing CQRS and distributed processing of large sets of data through DDD?

I've found some different options including Lokad, NServiceBus, MassTransit, MPAPI, but would love to hear what, if any, tools HN users are utilizing.

I started use Circus. New and in active development. Greg Young mentioned at GOTO talk last year (https://www.youtube.com/watch?v=8JKjvY4etTY&t=2712)


Thank you. I hadn't heard of this one, so thanks for linking this and the video.

One more I'll add to the mix that has come in handy several times: CsQuery jQuery port. https://github.com/jamietre/CsQuery

Some that I've been enjoying lately:

- SpecsFor: Some nice BDD wrappers around NUnit and Moq http://specsfor.com/ - Glimpse: A great diagnostic console tool for ASP.NET applications http://getglimpse.com/ - FluentMigrator: Awesome DB migration framework https://github.com/schambers/fluentmigrator

re: Formo

Last summer and into the fall, I had plans for Formo 2.0, which included a lot more flexibility and customization capabilities (json config, http context config, environment variables, etc). When I learned about aspnet5's configuration I essentially stopped development on Formo. The big reason being that they're building in such a way that I imagined Formo would be used. (Which makes me quite happy)

For that reason, the project is largely "finished", but it's still stable and alive.

Great list. I found BizArk.Core powerful console application entry point library very useful. It provides command line arguments parsing based on class and properties atributes https://bizark.codeplex.com/wikipage?title=Console%20applica...

Great list, but could use more F# love!

Lots of cool/useful open source projects are always popping up in the F# community - http://fsharp.org/community/projects/

Favs of mine from that list: Visual F# Power Tools, FSharp.Data.SqlClient, FsEye, Fantomas, R type provider

Reading through the list I realized that we have implemented every single one of these things for ourselves over years of coding.

You guys should check these ones:

* Hangfire(http://hangfire.io/): for background jobs.

* Polly(https://github.com/michael-wolfenden/Polly): For exception handling policies.

Edit: formatting.

Hangfire is the first library in the post.

My fault, I just read the comments here :)

Polly is slick. Takes care of something I've been doing adhoc for a long time.

CircuitBreaker is neat otherwise you know how hard it would be to implement it

I can't believe no one mentioned EPPlus for manipulating excel spreadsheets.

FastJSON is my favorite non JSON.NET Json serializer.

As an alternative to CsvHelper I can recommend FileHelpers by Marcos Meli: http://filehelpers.sourceforge.net/

Don't be put off by the dated SourceForge location. It is pure awesome for getting data in and out of CSV format.

As someone who spends a lot of time on file processing I appreciate the link. Althought I have to selfishly admit that had I stumbled on to this myself I would have avoided it just because of SourceForge.

How well does it handle the oddball cases? Not that you could call CSV a rigorously-defined spec, but we have a vendor that sends us a file where they sometimes don't escape double-quotes correctly.

That is where I've found it's strengths to be. I've used it to process affiliate feed data. The quality is pretty poor and it has been pretty robust.

About Object Mappers

* AutoMapper is a great mapper, but too slow http://automapper.org/

* TinyMapper is extremely quick http://tinymapper.net/

A collection of awesome .NET libraries, tools, frameworks and software (curated by community) https://github.com/quozd/awesome-dotnet

Hangfire looks great. I'm currently running all my jobs through Azure Scheduler. Would anyone know what the pros & cons are between these two job schedulers? Are there certain requirements or architectures that favor one or the other?

Perhaps this is obvious but if you aren't running your own server, your web app (and Hangfire along with it) can stop running during a period of inactivity. Obviously this is not a problem with Azure scheduler.

I use Hangfire and then simply have Azure Scheduler ping my site regularly.

Will check out top shelf and love the list.

very handy!

Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | Legal | Apply to YC | Contact