有没有可能对后台工作人员有一个共同的方法?
本文关键字:方法 有一个 工作人员 有可能 后台 | 更新日期: 2023-09-27 18:18:27
我注意到,随着应用程序数据库的增长,返回结果所花费的时间也增加了。在开始时,这是可以忽略不计的,因为返回数据源的时间非常短。
现在我在一点,它暂时使UI无响应几秒钟,但我想创建background workers
来完成这些任务。
创建这些的问题是,大约有9个按钮需要后台工作人员,他们所做的就是在DLL中调用不同的方法。是否有任何方法使用一个通用的方法来创建这些后台工作人员使用API的后台工作人员,或者我应该创建一个Enum
对应于每个按钮,是一个参数的方法,构造后台工作人员。因此,这意味着我可以使用一个简单的switch
从我选择的DLL执行任何方法?
示例代码:
void bg_DoWorkImports(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
try
{
e.Result = EngineBllUtility.GetNotImportedFiles(connectionString);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
void bg_RunWorkerCompletedImports(object sender, RunWorkerCompletedEventArgs e)
{
DataSet temp = (DataSet)e.Result;
if (e.Result != null)
{
importFileGridView.DataSource = temp.Tables[0];
}
}
你可以将Func<T>
传递给一个方法,该方法创建一个BackgroundWorker并从内部调用该操作到DoWork-event。
像这样
public class BackgroundWrapper<T>
{
private Func<T> workMethod;
private Action<T> completeMethod;
public static void StartBackgroundworker(Func<T> workMethod, Action<T> completeMethod)
{
BackgroundWrapper<T> bWrap = new BackgroundWrapper<T>();
bWrap.workMethod = workMethod;
bWrap.completeMethod = completeMethod;
bWrap.Start();
}
private void Start()
{
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.RunWorkerAsync();
}
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
completeMethod((T)e.Result);
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
e.Result = workMethod();
}
}
不使用BackgroundWorker,另一种选择是使用TPL。这将允许您直接在每个成员中编写代码:
void buttonImport_Click(object sender, DoWorkEventArgs e)
{
Task.Factory
.StartNew( () => return EngineBllUtility.GetNotImportedFiles(connectionString))
.ContinueWith( t =>
{
try
{
if (t.Result != null)
{
importFileGridView.DataSource = t.Result.Tables[0];
}
}
catch (AggregateException ex)
{
MessageBox.Show(ex.InnerException.Message);
}
}, TaskScheduler.FromCurrentSynchronizationContext());
}
当然,我不明白为什么你不能为此创建一个"交换机"之类的函数。事实上,您可能希望这样做,因为它会使事情变得更模块化,并促进代码重用。
就枚举而言,个人而言,我创建类来传入和传出大量的参数。
我认为您需要构建某种排队机制,其中一个后台工作人员拾取每个按钮单击作业并一个接一个地启动。