为什么我的方法不是异步的?

时间:2014-05-08 05:29:18

标签: c# multithreading asynchronous

当我有以下代码时,它执行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.
 }  
}

2 个答案:

答案 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());
}

我认为在构造函数中进行长时间运行的过程并不是一个好主意。