如何在asp.net C#4.0中调用异步方法?

我知道.net 4.5有等待,异步关键字允许轻松调用异步方法。 我目前正在研究如何在C#4.0中进行异步调用。 我想要的一个例子是在datagrid是数据绑定的情况下进行异步调用。

如果你能给我一些链接我真的很感激。

看一下使用任务,这可以在.Net 4中找到并且可以帮到你。 一个简单的例子可能如下所示:

public void MainFlow() { Task taskWork = Task.Factory.StartNew(new Action(DoWork)); //Do other work //Then wait for thread finish taskWork.Wait(); } private void DoWork() { //Do work } 

更多信息,请看这里

http://msdn.microsoft.com/en-us/library/system.threading.tasks.task(v=vs.100).aspx

使用Task.ContinueWith,它基本上在任务完成后执行您的操作。

一些可能有用的例子:

http://msdn.microsoft.com/en-us/library/dd784422.aspx

我们为执行异步操作制作了一些工具类。

这些方法实际上做了什么:异步执行操作,然后将completition的执行相应地发布到同步上下文。

我们将其作为TPL的包装器,以便在我们调用长时间运行操作时轻松使用它。 这个类也有可以取消的行为的类比,而不仅仅是放弃。

 public static class AsyncExecutor { public static CancellationTokenSource ExecuteBlockingOperation(Action action, Action completition, Action onException) { if (action == null) throw new ArgumentNullException("action"); if (completition == null) throw new ArgumentNullException("completition"); var cts = new CancellationTokenSource(); var token = cts.Token; var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); var task = new Task(action, TaskCreationOptions.LongRunning); task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler); task.ContinueWith(asyncPart => { if (!token.IsCancellationRequested) completition(); }, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler); task.Start(); return cts; } public static CancellationTokenSource ExecuteBlockingOperation(Action action, TIn parameter, Action completition, Action onException) { if (action == null) throw new ArgumentNullException("action"); if (completition == null) throw new ArgumentNullException("completition"); var cts = new CancellationTokenSource(); var token = cts.Token; var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); var task = new Task(() => action(parameter), TaskCreationOptions.LongRunning); task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception, parameter), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler); task.ContinueWith(asyncPart => { if (!token.IsCancellationRequested) completition(parameter); }, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler); task.Start(); return cts; } public static CancellationTokenSource ExecuteBlockingOperation(Func func, Action completition, Action onException) { if (func == null) throw new ArgumentNullException("func"); if (completition == null) throw new ArgumentNullException("completition"); var cts = new CancellationTokenSource(); var token = cts.Token; var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); var task = new Task(func, TaskCreationOptions.LongRunning); task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler); task.ContinueWith(asyncPart => { if (!token.IsCancellationRequested) completition(asyncPart.Result); }, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler); task.Start(); return cts; } public static CancellationTokenSource ExecuteBlockingOperation(Func func, TIn parameter, Action completition, Action onException) { if (func == null) throw new ArgumentNullException("func"); if (completition == null) throw new ArgumentNullException("completition"); var cts = new CancellationTokenSource(); var token = cts.Token; var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); var task = new Task(() => func(parameter), TaskCreationOptions.LongRunning); task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception, parameter), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler); task.ContinueWith(asyncPart => { if (!token.IsCancellationRequested) completition(asyncPart.Result, parameter); }, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler); task.Start(); return cts; } public static CancellationTokenSource ExecuteBlockingOperation(Func func, TIn parameter, Action completition, Action onException) { if (func == null) throw new ArgumentNullException("func"); if (completition == null) throw new ArgumentNullException("completition"); var cts = new CancellationTokenSource(); var token = cts.Token; var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); var task = new Task(() => func(parameter), TaskCreationOptions.LongRunning); task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception, parameter), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler); task.ContinueWith(asyncPart => { if (!token.IsCancellationRequested) completition(asyncPart.Result); }, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler); task.Start(); return cts; } public static CancellationTokenSource ExecuteBlockingOperation(Func func, TIn parameter, Action completition, Action onException) { if (func == null) throw new ArgumentNullException("func"); if (completition == null) throw new ArgumentNullException("completition"); var cts = new CancellationTokenSource(); var token = cts.Token; var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); var task = new Task(() => func(parameter), TaskCreationOptions.LongRunning); task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception, parameter), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler); task.ContinueWith(asyncPart => { if (!token.IsCancellationRequested) completition(parameter); }, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler); task.Start(); return cts; } public static CancellationTokenSource ExecuteBlockingOperation(Func func, TIn parameter, Action completition, Action onException) { if (func == null) throw new ArgumentNullException("func"); if (completition == null) throw new ArgumentNullException("completition"); var cts = new CancellationTokenSource(); var token = cts.Token; var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); var task = new Task(() => func(parameter), TaskCreationOptions.LongRunning); task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception, parameter), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler); task.ContinueWith(asyncPart => { if (!token.IsCancellationRequested) completition(); }, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler); task.Start(); return cts; } public static CancellationTokenSource ExecuteBlockingOperation(Func func, TIn parameter, Action completition, Action onException) { if (func == null) throw new ArgumentNullException("func"); if (completition == null) throw new ArgumentNullException("completition"); var cts = new CancellationTokenSource(); var token = cts.Token; var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); var task = new Task(() => func(parameter), TaskCreationOptions.LongRunning); task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler); task.ContinueWith(asyncPart => { if (!token.IsCancellationRequested) completition(parameter); }, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler); task.Start(); return cts; } public static CancellationTokenSource ExecuteBlockingOperation(Func func, TIn parameter, Action completition, Action onException) { if (func == null) throw new ArgumentNullException("func"); if (completition == null) throw new ArgumentNullException("completition"); var cts = new CancellationTokenSource(); var token = cts.Token; var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); var task = new Task(() => func(parameter), TaskCreationOptions.LongRunning); task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler); task.ContinueWith(asyncPart => { if (!token.IsCancellationRequested) completition(asyncPart.Result, parameter); }, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler); task.Start(); return cts; } public static CancellationTokenSource ExecuteBlockingOperation(Func func, TIn parameter, Action completition, Action onException) { if (func == null) throw new ArgumentNullException("func"); if (completition == null) throw new ArgumentNullException("completition"); var cts = new CancellationTokenSource(); var token = cts.Token; var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); var task = new Task(() => func(parameter), TaskCreationOptions.LongRunning); task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler); task.ContinueWith(asyncPart => { if (!token.IsCancellationRequested) completition(asyncPart.Result); }, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler); task.Start(); return cts; } public static CancellationTokenSource ExecuteBlockingOperation(Func func, TIn parameter, Action completition, Action onException) { if (func == null) throw new ArgumentNullException("func"); if (completition == null) throw new ArgumentNullException("completition"); var cts = new CancellationTokenSource(); var token = cts.Token; var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); var task = new Task(() => func(parameter), TaskCreationOptions.LongRunning); task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler); task.ContinueWith(asyncPart => { if (!token.IsCancellationRequested) completition(); }, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler); task.Start(); return cts; } public static void ExecuteBlockingOperation(Action action, Action completition, Func shouldComplete, Action onException) { if (action == null) throw new ArgumentNullException("action"); if (completition == null) throw new ArgumentNullException("completition"); var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); var task = new Task(action, TaskCreationOptions.LongRunning); task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler); task.ContinueWith(asyncPart => { if (shouldComplete == null || shouldComplete()) completition(); }, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler); task.Start(); } public static void ExecuteBlockingOperation(Action action, TIn parameter, Action completition, Predicate shouldComplete, Action onException) { if (action == null) throw new ArgumentNullException("action"); if (completition == null) throw new ArgumentNullException("completition"); var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); var task = new Task(() => action(parameter), TaskCreationOptions.LongRunning); task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception, parameter), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler); task.ContinueWith(asyncPart => { if (shouldComplete == null || shouldComplete(parameter)) completition(parameter); }, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler); task.Start(); } public static void ExecuteBlockingOperation(Func func, Action completition, Predicate shoudComplete, Action onException) { if (func == null) throw new ArgumentNullException("func"); if (completition == null) throw new ArgumentNullException("completition"); var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); var task = new Task(func, TaskCreationOptions.LongRunning); task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler); task.ContinueWith(asyncPartTask => { if (shoudComplete == null || shoudComplete(asyncPartTask.Result)) completition(asyncPartTask.Result); }, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler); task.Start(); } public static void ExecuteBlockingOperation(Func func, TIn parameter, Action completition, Func shouldComplete, Action onException) { if (func == null) throw new ArgumentNullException("func"); if (completition == null) throw new ArgumentNullException("completition"); var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); var task = new Task(() => func(parameter), TaskCreationOptions.LongRunning); task.ContinueWith(asyncPartTask => onException(asyncPartTask.Exception, parameter), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler); // on Exception task.ContinueWith(asyncPart => { if (shouldComplete == null || shouldComplete(asyncPart.Result, parameter)) completition(asyncPart.Result, parameter); }, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler); task.Start(); } }