我注意到,随着我的应用程序数据库的增长,返回结果所需的时间也增加了。一开始这可以忽略不计,因为返回数据源的时间非常短。
现在我正处于暂时使 UI 无响应几秒钟的地步,但我想创建 background workers
来完成这些任务。
创建这些按钮的问题在于,大约有 9 个按钮需要后台 worker ,而他们所做的只是调用 DLL 中的不同方法。有没有什么方法可以使用通用方法使用后台工作人员的 API 创建这些后台工作人员,或者我应该创建一个 Enum
对应于每个按钮并且是构造后台 worker 。这意味着我可以使用一个简单的 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 事件的方法。
像这样
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();
}
}
关于c# - 后台 worker 可以有一个通用的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8594412/