Skip to content

Commit d8ed069

Browse files
committed
Added more Async overloads.
1 parent b54c351 commit d8ed069

File tree

2 files changed

+161
-4
lines changed

2 files changed

+161
-4
lines changed

src/ProgressDialogEx/ProgressDialog/IProgressDialogService.cs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Threading;
3+
using System.Threading.Tasks;
34

45
namespace ProgressDialogEx.ProgressDialog
56
{
@@ -49,5 +50,47 @@ bool TryExecute<T>(Func<IProgress<string>, T> action,
4950
/// </summary>
5051
bool TryExecute<T>(Func<CancellationToken, IProgress<string>, T> action,
5152
ProgressDialogOptions options, out T result);
53+
54+
/// <summary>
55+
/// Executes a non-cancellable async task.
56+
/// </summary>
57+
Task ExecuteAsync(Func<Task> action, ProgressDialogOptions options);
58+
59+
/// <summary>
60+
/// Executes a cancellable async task.
61+
/// </summary>
62+
Task ExecuteAsync(Func<CancellationToken, Task> action, ProgressDialogOptions options);
63+
64+
/// <summary>
65+
/// Executes a non-cancellable async task that reports progress.
66+
/// </summary>
67+
Task ExecuteAsync(Func<IProgress<string>, Task> action, ProgressDialogOptions options);
68+
69+
/// <summary>
70+
/// Executes a cancellable async task that reports progress.
71+
/// </summary>
72+
Task ExecuteAsync(Func<CancellationToken, IProgress<string>, Task> action,
73+
ProgressDialogOptions options);
74+
75+
/// <summary>
76+
/// Executes a non-cancellable async task that returns a value.
77+
/// </summary>
78+
Task<T> ExecuteAsync<T>(Func<Task<T>> action, ProgressDialogOptions options);
79+
80+
/// <summary>
81+
/// Executes a cancellable async task that returns a value.
82+
/// </summary>
83+
Task<T> ExecuteAsync<T>(Func<CancellationToken, Task<T>> action, ProgressDialogOptions options);
84+
85+
/// <summary>
86+
/// Executes a non-cancellable async task that reports progress and returns a value.
87+
/// </summary>
88+
Task<T> ExecuteAsync<T>(Func<IProgress<string>, Task<T>> action, ProgressDialogOptions options);
89+
90+
/// <summary>
91+
/// Executes a cancellable async task that reports progress and returns a value.
92+
/// </summary>
93+
Task<T> ExecuteAsync<T>(Func<CancellationToken, IProgress<string>, Task<T>> action,
94+
ProgressDialogOptions options);
5295
}
5396
}

src/ProgressDialogEx/ProgressDialog/ProgressDialogService.cs

Lines changed: 118 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,66 @@ public bool TryExecute<T>(Func<IProgress<string>, T> action, ProgressDialogOptio
6262
isCancellable: false);
6363
}
6464

65-
public bool TryExecute<T>(Func<CancellationToken, IProgress<string>, T> action,
65+
public bool TryExecute<T>(Func<CancellationToken, IProgress<string>, T> action,
6666
ProgressDialogOptions options, out T result)
6767
{
6868
if (action == null) throw new ArgumentNullException("action");
6969
return TryExecuteInternal(action, options, out result);
7070
}
7171

72-
private void ExecuteInternal(Action<CancellationToken, IProgress<string>> action,
72+
public async Task ExecuteAsync(Func<Task> action, ProgressDialogOptions options)
73+
{
74+
if (action == null) throw new ArgumentNullException("action");
75+
await ExecuteAsyncInternal((token, progress) => action(), options);
76+
}
77+
78+
public async Task ExecuteAsync(Func<CancellationToken, Task> action, ProgressDialogOptions options)
79+
{
80+
if (action == null) throw new ArgumentNullException("action");
81+
await ExecuteAsyncInternal((token, progress) => action(token), options);
82+
}
83+
84+
public async Task ExecuteAsync(Func<IProgress<string>, Task> action, ProgressDialogOptions options)
85+
{
86+
if (action == null) throw new ArgumentNullException("action");
87+
await ExecuteAsyncInternal((token, progress) => action(progress), options,
88+
isCancellable: false);
89+
}
90+
91+
public async Task ExecuteAsync(Func<CancellationToken, IProgress<string>, Task> action,
92+
ProgressDialogOptions options)
93+
{
94+
if (action == null) throw new ArgumentNullException("action");
95+
await ExecuteAsyncInternal(action, options);
96+
}
97+
98+
public async Task<T> ExecuteAsync<T>(Func<Task<T>> action, ProgressDialogOptions options)
99+
{
100+
if (action == null) throw new ArgumentNullException("action");
101+
return await ExecuteAsyncInternal((token, progress) => action(), options);
102+
}
103+
104+
public async Task<T> ExecuteAsync<T>(Func<CancellationToken, Task<T>> action, ProgressDialogOptions options)
105+
{
106+
if (action == null) throw new ArgumentNullException("action");
107+
return await ExecuteAsyncInternal((token, progress) => action(token), options);
108+
}
109+
110+
public async Task<T> ExecuteAsync<T>(Func<IProgress<string>, Task<T>> action, ProgressDialogOptions options)
111+
{
112+
if (action == null) throw new ArgumentNullException("action");
113+
return await ExecuteAsyncInternal((token, progress) => action(progress), options,
114+
isCancellable: false);
115+
}
116+
117+
public async Task<T> ExecuteAsync<T>(Func<CancellationToken, IProgress<string>, Task<T>> action,
118+
ProgressDialogOptions options)
119+
{
120+
if (action == null) throw new ArgumentNullException("action");
121+
return await ExecuteAsyncInternal(action, options);
122+
}
123+
124+
private void ExecuteInternal(Action<CancellationToken, IProgress<string>> action,
73125
ProgressDialogOptions options, bool isCancellable = true)
74126
{
75127
if (action == null) throw new ArgumentNullException("action");
@@ -100,7 +152,7 @@ private void ExecuteInternal(Action<CancellationToken, IProgress<string>> action
100152
}
101153

102154
private bool TryExecuteInternal<T>(
103-
Func<CancellationToken, IProgress<string>, T> action,
155+
Func<CancellationToken, IProgress<string>, T> action,
104156
ProgressDialogOptions options, out T result, bool isCancellable = true)
105157
{
106158
if (action == null) throw new ArgumentNullException("action");
@@ -111,7 +163,7 @@ private bool TryExecuteInternal<T>(
111163
CancellationToken cancellationToken = cancellationTokenSource.Token;
112164

113165
var cancelCommand = isCancellable ? new CancelCommand(cancellationTokenSource) : null;
114-
166+
115167
var viewModel = new ProgressDialogWindowViewModel(
116168
options, cancellationToken, cancelCommand);
117169

@@ -144,5 +196,67 @@ private bool TryExecuteInternal<T>(
144196
return false;
145197
}
146198
}
199+
200+
async private Task<T> ExecuteAsyncInternal<T>(
201+
Func<CancellationToken, IProgress<string>, Task<T>> action,
202+
ProgressDialogOptions options, bool isCancellable = true)
203+
{
204+
if (action == null) throw new ArgumentNullException("action");
205+
if (options == null) throw new ArgumentNullException("options");
206+
207+
using (var cancellationTokenSource = new CancellationTokenSource())
208+
{
209+
CancellationToken cancellationToken = cancellationTokenSource.Token;
210+
211+
var cancelCommand = isCancellable ? new CancelCommand(cancellationTokenSource) : null;
212+
213+
var viewModel = new ProgressDialogWindowViewModel(
214+
options, cancellationToken, cancelCommand);
215+
216+
var window = new ProgressDialogWindow
217+
{
218+
DataContext = viewModel
219+
};
220+
221+
Task<T> task = action(cancellationToken, viewModel.Progress);
222+
223+
task.ContinueWith(_ => viewModel.Close = true);
224+
225+
window.ShowDialog();
226+
227+
return await task;
228+
}
229+
}
230+
231+
async private Task ExecuteAsyncInternal(
232+
Func<CancellationToken, IProgress<string>, Task> action,
233+
ProgressDialogOptions options, bool isCancellable = true)
234+
{
235+
if (action == null) throw new ArgumentNullException("action");
236+
if (options == null) throw new ArgumentNullException("options");
237+
238+
using (var cancellationTokenSource = new CancellationTokenSource())
239+
{
240+
CancellationToken cancellationToken = cancellationTokenSource.Token;
241+
242+
var cancelCommand = isCancellable ? new CancelCommand(cancellationTokenSource) : null;
243+
244+
var viewModel = new ProgressDialogWindowViewModel(
245+
options, cancellationToken, cancelCommand);
246+
247+
var window = new ProgressDialogWindow
248+
{
249+
DataContext = viewModel
250+
};
251+
252+
Task task = action(cancellationToken, viewModel.Progress);
253+
254+
task.ContinueWith(_ => viewModel.Close = true);
255+
256+
window.ShowDialog();
257+
258+
await task;
259+
}
260+
}
147261
}
148262
}

0 commit comments

Comments
 (0)