Skip to content

Commit f1733dd

Browse files
committed
Search cancellation
1 parent ec5e94a commit f1733dd

File tree

4 files changed

+125
-125
lines changed

4 files changed

+125
-125
lines changed

SmartImage.Lib/Engines/Model/BaseSearchEngine.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,14 @@ protected virtual Uri GetRawUri(ImageQuery query)
8888
protected virtual SearchResultOrigin GetResultOrigin(ImageQuery query, CancellationToken? c = null)
8989
{
9090
Uri rawUri = GetRawUri(query);
91-
92-
const int maxAutoRedirects = 50;
91+
9392

9493
var res = HttpUtilities.GetHttpResponse(rawUri.ToString(),
9594
(int) Timeout.TotalMilliseconds,
9695
HttpMethod.Get, FollowRedirects);
96+
97+
98+
9799
bool success;
98100

99101
if (res is { IsSuccessStatusCode: false }) {

SmartImage.Lib/SearchClient.cs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,6 @@ public SearchClient(SearchConfig config)
9797
private List<Task> ContinueTasks { get; }
9898

9999

100-
101-
102100
/// <summary>
103101
/// Reloads <see cref="Config" /> and <see cref="Engines" /> accordingly.
104102
/// </summary>
@@ -136,26 +134,28 @@ public void Reset()
136134
/// <summary>
137135
/// Performs an image search asynchronously.
138136
/// </summary>
139-
public async Task RunSearchAsync(CancellationTokenSource cts = null, CancellationTokenSource cts2= null)
137+
public async Task RunSearchAsync(CancellationToken? cts = null)
140138
{
141139
if (IsComplete) {
142140
Reset();
143141
}
144142

143+
cts ??= CancellationToken.None;
145144

146145
Tasks = new List<Task<SearchResult>>(Engines.Select(engine =>
147146
{
148-
var task = engine.GetResultAsync(Config.Query, cts?.Token ?? CancellationToken.None);
147+
var task = engine.GetResultAsync(Config.Query, cts.Value);
149148

150149
return task;
151150
}));
152151

153152
PendingCount = Tasks.Count;
154153

155-
while (!IsComplete) {
154+
155+
while (!IsComplete && !cts.Value.IsCancellationRequested) {
156156
var finished = await Task.WhenAny(Tasks);
157157

158-
var task = finished.ContinueWith(GetResultContinueCallback, null, cts2?.Token ?? CancellationToken.None,
158+
var task = finished.ContinueWith(GetResultContinueCallback, null, cts.Value,
159159
0, TaskScheduler.Default);
160160
ContinueTasks.Add(task);
161161

@@ -225,14 +225,13 @@ public async Task RunSearchAsync(CancellationTokenSource cts = null, Cancellatio
225225
SearchCompleted?.Invoke(null, args);
226226
}
227227

228-
public async Task RunContinueAsync()
228+
public async Task RunContinueAsync(CancellationToken? c = null)
229229
{
230230

231231
IsContinueComplete = false;
232+
c??= CancellationToken.None;
232233

233-
234-
235-
while (!IsContinueComplete) {
234+
while (!IsContinueComplete&&!c.Value.IsCancellationRequested) {
236235
var task = await Task.WhenAny(ContinueTasks);
237236
await task;
238237

SmartImage.Lib/Utilities/ImageHelper.cs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,16 @@ public static string Download(Uri src, string path)
6666
/// <param name="url">Url to search</param>
6767
/// <param name="count">Number of direct images to return</param>
6868
/// <param name="timeoutMS"></param>
69-
public static async Task<List<DirectImage>> ScanForImages(string url, int count = 10, long timeoutMS = TimeoutMS)
69+
/// <param name="c"></param>
70+
public static async Task<List<DirectImage>> ScanForImages(string url, int count = 10, long timeoutMS = TimeoutMS,
71+
CancellationToken? c2 = null)
7072
{
7173
var images = new List<DirectImage>();
7274

7375
IHtmlDocument document = null;
7476

77+
var c =c2?? CancellationToken.None;
78+
7579
try {
7680
var client = new HttpClient();
7781
var task = client.GetStringAsync(url);
@@ -90,7 +94,6 @@ public static async Task<List<DirectImage>> ScanForImages(string url, int count
9094
return images;
9195
}
9296

93-
using var cts = new CancellationTokenSource();
9497

9598
var urls = new List<string>();
9699

@@ -132,15 +135,15 @@ public static async Task<List<DirectImage>> ScanForImages(string url, int count
132135
{
133136
string s = urls[iCopy];
134137

135-
if (IsImage(s, (int) timeoutMS, out var di)) {
138+
if (IsImage(s, (int) timeoutMS, out var di, c)) {
136139
return di;
137140
}
138141

139142
di?.Dispose();
140143

141144
return null;
142145

143-
}, cts.Token));
146+
}, c));
144147
}
145148

146149
while (tasks.Any() && count != 0) {
@@ -164,11 +167,11 @@ public static async Task<List<DirectImage>> ScanForImages(string url, int count
164167
return images;
165168
}
166169

167-
public static bool IsImage(string url, out DirectImage di)
168-
=> IsImage(url, TimeoutMS, out di);
170+
public static bool IsImage(string url, out DirectImage di, CancellationToken? c = null)
171+
=> IsImage(url, TimeoutMS, out di, c);
169172

170173

171-
public static bool IsImage(string url, long timeout, out DirectImage di)
174+
public static bool IsImage(string url, long timeout, out DirectImage di, CancellationToken? c = null)
172175
{
173176
di = new DirectImage();
174177

@@ -177,7 +180,9 @@ public static bool IsImage(string url, long timeout, out DirectImage di)
177180
}
178181

179182

180-
var response = HttpUtilities.GetHttpResponse(url, (int) timeout, HttpMethod.Head);
183+
var response1 = HttpUtilities.GetHttpResponseAsync(url, (int) timeout, HttpMethod.Head, token: c);
184+
response1.Wait();
185+
var response = response1.Result;
181186

182187
// var response1 = HttpUtilities.GetHttpResponseAsync(url, (int) timeout, HttpMethod.Head, c: c);
183188
// response1.Wait();
@@ -210,7 +215,7 @@ public static bool IsImage(string url, long timeout, out DirectImage di)
210215

211216
try {
212217
using var client = new HttpClient();
213-
var task = client.GetStreamAsync(url);
218+
var task = client.GetStreamAsync(url, c ?? CancellationToken.None);
214219
task.Wait((int) timeout);
215220

216221
var stream = task.Result;

0 commit comments

Comments
 (0)