当我有以下代码时,它执行async:
Task.Factory.StartNew(() => new Class(string, string2, string3));
当我像这样制作一个通用方法时,异步不再起作用了:
private void StartTask<T>(string, string2, string3) where T : BaseClass10
{
var instance = (T) Activator.CreateInstance(typeof (T), string, string2, string3);
Task.Factory.StartNew(() => instance);
}
我这样执行:
StartNew<SomeClass>(string1, string2, string);
StartNew<SomeClass2>(string1, string2, string);
第一个StartNew在第一个完成后执行......可能是什么原因?
编辑: SomeClass代码:
public class SomeClass {
public SomeClass(string1, string2, string3){
// Long running process that takes time to complete. For example Thread.Sleep or what ever.
}
}
答案 0 :(得分:3)
我明白你的意思了。您的第一个版本调用Task
中的构造函数(可能是线程池线程)。所以它会在完成之前立即返回。你在第二种方法中调用Activator.CreateInstance
,这就是实际创建实例并执行构造函数的内容。
正如您所看到的,Activator.CreateInstance
是从调用线程本身而不是在任务内部调用的,它会同步执行。
要按照您的预期制作通用方法,您需要将其包装在Task
中,如下所示:
private void StartTask<T>(string, string2, string3) where T : BaseClass10
{
Task.Factory.StartNew(() => (T) Activator.CreateInstance(typeof (T), string, string2, string3));
}
答案 1 :(得分:2)
您原来的StartTask
方法:
private void StartTask<T>(string, string2, string3) where T : BaseClass10
{
var instance = (T) Activator.CreateInstance(typeof (T), string, string2, string3);
Task.Factory.StartNew(() => instance);
}
如果长时间运行的进程发生在T
的构造函数中,请注意长时间运行的进程发生在Task.Factory.StartNew()
之外。
将长时间运行的流程移至LongRunningProcess()
上的方法(例如T
),然后您就可以执行此操作:
private void StartTask<T>(string, string2, string3) where T : BaseClass10
{
var instance = (T) Activator.CreateInstance(typeof (T), string, string2, string3);
Task.Factory.StartNew(() => instance.LongRunningProcess());
}
我认为在构造函数中进行长时间运行的过程并不是一个好主意。