До .NET 3.5 было довольно часто объявлять свое. Теперь Action
является хорошим кандидатом, но ThreadStart
обычно использовался (довольно запутанно), или MethodInvoker
, если вы уже ссылались на winforms.
Быстрый тест (обратите внимание, работает в .NET 4.0, использует только некоторые библиотеки - поэтому не исчерпывающий):
var qry = from asm in AppDomain.CurrentDomain.GetAssemblies()
from type in asm.GetTypes()
where type.IsSubclassOf(typeof(Delegate))
let method = type.GetMethod("Invoke")
where method != null && method.ReturnType == typeof(void)
&& method.GetParameters().Length == 0
orderby type.AssemblyQualifiedName
select type.AssemblyQualifiedName;
foreach (var name in qry) Console.WriteLine(name);
показывает еще несколько кандидатов:
System.Action, mscorlib...
System.CrossAppDomainDelegate, mscorlib...
System.IO.Pipes.PipeStreamImpersonationWorker, System.Core...
System.Linq.Expressions.Compiler.LambdaCompiler+WriteBack, System.Core...
System.Net.UnlockConnectionDelegate, System...
System.Runtime.Remoting.Contexts.CrossContextDelegate, mscorlib...
System.Threading.ThreadStart, mscorlib...
System.Windows.Forms.AxHost+AboutBoxDelegate, System.Windows.Forms...
System.Windows.Forms.MethodInvoker, System.Windows.Forms...