我已经创建了一个下载管理器,但就下载管理器存储下载参数而言,它运行良好。
Downloader downloader = new Downloader();
downloader.Add(new List<Query>(){
new Query(dataset.trans_sprzedaz_pozycje, () => dataset.PobierzTransSprzedazPozycja(downloader.Filter)),
new Query(dataset.trans_sprzedaz_rabaty_dodatkowe, () => dataset.PobierzDokumentySprzedazyRabaty(downloader.Filter)),
new Query(dataset.trans_sprzedaz_teksty, () => dataset.PobierzDokumentySprzedazyTeksty(downloader.Filter))
});
但在某些情况下,我需要我的查询来存储参数,所以它应该看起来像:
Downloader downloader = new Downloader();
downloader.Add(new List<Query>(){
new Query(dataset.trans_sprzedaz_pozycje, () => dataset.PobierzTransSprzedazPozycja(query.Filter)),
new Query(dataset.trans_sprzedaz_rabaty_dodatkowe, () => dataset.PobierzDokumentySprzedazyRabaty(query.Filter)),
new Query(dataset.trans_sprzedaz_teksty, () => dataset.PobierzDokumentySprzedazyTeksty(query.Filter))
});
请注意,在第一个代码片段中,我使用下载器。过滤器,在第二秒内我使用(捏造的(查询。滤波器
我知道我可以做这样的结构:
var query = new Query(dsSprzedaz.trans_sprzedaz_pozycje);
query.AddFunc(() => dsSprzedaz.PobierzTransSprzedazPozycja(query.Filter));
但是像这样添加 20-30 个查询会很糟糕。
我尝试了这样的解决方案:
Filter filter;
new Query(dsSprzedaz.trans_sprzedaz_pozycje,() => dsSprzedaz.PobierzTransSprzedazPozycja(filter), out filter),
但它从查询中复制值。筛选器,而不是引用。
//编辑
这是下载器最重要的代码:
private Task Execute()
{
var Tasks = new List<Task>(Queries.Count);
foreach (var query in Queries)
{
var task = query.Execute(CancellationToken);
Tasks.Add(task);
}
return Task.WhenAll(Tasks);
}
private void CreateFilter(List<long> id_list)
{
lock (Data)
{
Data.Clear();
Data.Append("(0");
foreach (var value in id_list)
Data.Append("," + value);
Data.Append(")");
}
}
public string Filter
{
get
{
return Data.ToString();
}
}
和查询:
public class Query
{
DataTable Source;
Func<DataTable> Download;
StringBuilder Data;
public Query(DataTable Source, Expression<Func<DataTable>> Download, out string filter)
{
this.Source = Source;
this.Data = new StringBuilder();
filter = Filter;
this.Download = Download.Compile();
}
public async Task Execute(CancellationToken cancellationToken)
{
try
{
DataTable result = await Task.Run(() => Download());
if (cancellationToken.IsCancellationRequested) return;
Source.Merge(result);
}
catch (Exception) { }
}
private void CreateFilter(List<long> id_list)
{
lock (Data)
{
Data.Clear();
Data.Append("(0");
foreach (var value in id_list)
Data.Append("," + value);
Data.Append(")");
}
}
public string Filter
{
get
{
return Data.ToString();
}
}
}
'
-
如果查询应该使用它自己的过滤器,则存储信息(您说您只想使用它的过滤器几次,在其他情况下您想使用 Downloader.Filter(
public class Query { DataTable Source; Func<string, DataTable> Download; StringBuilder Data; public bool IsOwnFilter { get; set; } public Query(DataTable Source, Func<string, DataTable> Download, bool isOwnFilter = false) { this.Source = Source; this.Data = new StringBuilder(); this.Download = Download; this.IsOwnFilter = isOwnFilter; } public async Task Execute(strign filter, CancellationToken cancellationToken) { try { DataTable result = await Task.Run(() => Download(filter)); if (cancellationToken.IsCancellationRequested) return; Source.Merge(result); } catch (Exception) { } } // This is not used in your code private void CreateFilter(List<long> id_list) { lock (Data) { Data.Clear(); Data.Append("(0"); foreach (var value in id_list) Data.Append("," + value); Data.Append(")"); } } public string Filter { get { return Data.ToString(); } } }
-
接下来,当您从下载器调用它时,请检查新标志并通过正确的过滤器:
private Task Execute() { var Tasks = new List<Task>(Queries.Count); foreach (var query in Queries) { // call Execute with Query filter or Downloader.Filter var task = query.Execute(query.IsOwnFilter ? query.Filter : Filter, CancellationToken); Tasks.Add(task); } return Task.WhenAll(Tasks); }
当您向下载器添加查询时:
Downloader downloader = new Downloader();
downloader.Add(new List<Query>(){
new Query(dataset.trans_sprzedaz_pozycje, (filter) => dataset.PobierzTransSprzedazPozycja(filter)),
new Query(dataset.trans_sprzedaz_rabaty_dodatkowe, (filter) => dataset.PobierzDokumentySprzedazyRabaty(filter)),
new Query(dataset.trans_sprzedaz_teksty, (filter) => dataset.PobierzDokumentySprzedazyTeksty(filter))
});