我已经创建了一个下载管理器,但是就下载管理器存储下载参数而言,它运行良好。
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))
});
请注意,在第一个代码段中,我使用downloader.Filter,第二个代码中,我使用(伪造的)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),
但它会复制来自query.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();
}
}
}
`
答案 0 :(得分:0)
使查询存储信息是否应使用其自己的过滤器(您说过只想使用它的过滤器几次,在其他情况下则要使用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();
}
}
}
下一步,当您从Downloader调用它时,检查是否有新标记并通过正确的过滤器:
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 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))
});