【发布时间】:2013-11-19 08:08:34
【问题描述】:
是否可以强制任务在当前线程上同步执行?
也就是说,是否有可能,例如将一些参数传递给StartNew(),以制作此代码:
Task.Factory.StartNew(() => ThisShouldBeExecutedSynchronously());
表现得像这样:
ThisShouldBeExecutedSynchronously();
背景:
我有一个叫IThreads的接口:
public interface IThreads
{
Task<TRet> StartNew<TRet>(Func<TRet> func);
}
我想对此有两种实现方式,一种使用线程的普通方法:
public class Threads : IThreads
{
public Task<TRet> StartNew<TRet>(Func<TRet> func)
{
return Task.Factory.StartNew(func);
}
}
还有一个不使用线程的(在某些测试场景中使用):
public class NoThreading : IThreads
{
public Task<TRet> StartNew<TRet>(Func<TRet> func)
{
// What do I write here?
}
}
我可以让NoThreading 版本只调用func(),但我想返回一个Task<TRet> 的实例,我可以在该实例上执行ContinueWith() 等操作。
【问题讨论】:
-
NoThreading 实现使用了哪些测试场景?存在一个实际上与线程无关的 IThreads 实现似乎很奇怪。
-
@Todd Bowles:我非常不喜欢人们回答问题而不是回答问题时说“嗯,你为什么要问这个?你不应该问这个。”
-
@SimpleFellow 我了解您来自哪里,但提供帮助的一个重要部分是了解问题和背景。在这种情况下,IThreads 感觉就像一个泄漏的抽象,它的非线程实现会让未来的开发人员感到困惑。
-
@ToddBowles 如果我将接口名称
IThreads更改为例如ITasks?相比之下,Task.Factory.StartNew()不一定会启动一个新线程。所以有了更好的名字,抽象泄漏就会消失,问题是有效的,对吧? -
@Todd Bowles “我知道你从哪里来”——那么我从哪里来?