我很想知道这一点,但从未真正找到答案.
我知道这是任务调度程序的一个提示,任务调度程序将在其中运行,并且任务调度程序可以(或现在将?)决定为该任务实例化非线程池线程.
我不知道(并且令人惊讶地在互联网上找不到)是一个"经验法则"何时指定一个长期运行的任务.是一秒多长?30秒?一分钟?5分钟?它是否与应用程序使用的任务量有关系?作为程序员,我应该使用线程池中的#threads进行一些计算,我创建了多少个任务,同时长时间运行了多少个任务,并根据这个来决定是否使用长时间运行的任务?
希望在这里学点东西.
我有各种任务的令牌,我需要更好地管理他们的取消,以获得我可以使用的取消通知:
token.Register(RegisterMethod);
Run Code Online (Sandbox Code Playgroud)
如何删除此"订阅"?有没有办法"UnRegister"?
我想过用TaskCompletionSource做一个解决方法.但我不知道它是否会运作良好.解决这种方法的最佳方法是什么?
这是一个多线程的可扩展HttpListener的一个很好的例子吗?
这是一个真正的IIS会这样做吗?
public class Program
{
private static readonly HttpListener Listener = new HttpListener();
public static void Main()
{
Listener.Prefixes.Add("http://+:80/");
Listener.Start();
Listen();
Console.WriteLine("Listening...");
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
private static async void Listen()
{
while (true)
{
var context = await Listener.GetContextAsync();
Console.WriteLine("Client connected");
Task.Factory.StartNew(() => ProcessRequest(context));
}
Listener.Close();
}
private static void ProcessRequest(HttpListenerContext context)
{
System.Threading.Thread.Sleep(10*1000);
Console.WriteLine("Response");
}
}
Run Code Online (Sandbox Code Playgroud)
我特意寻找一种不依赖于IIS的可扩展解决方案.而只是在http.sys(这是httplistener类) - 不依赖于iIS的原因是因为政府.我工作的区域需要极大减少的攻击面积.
假设我有100个任务需要10秒钟.现在我想一次只运行10个,就像10个中的1个完成另一个任务一样,直到完成所有任务.
现在我总是习惯于ThreadPool.QueueUserWorkItem()这样的任务,但我已经读到这样做是不好的做法,我应该使用任务.
我的问题是我没有找到适合我的方案的好例子,所以你能让我开始研究如何通过Tasks实现这个目标吗?
我有示例代码来比较Parallel方法和Task方法的处理时间.这个实验的目标是了解它们是如何工作的.
所以我的问题是:
Task只是ThreadPool.QueueUserWorkItem方法的包装吗?
public Task SomeLongOperation()
{
return Task.Delay(3000);
}
static void Main(string[] args)
{
Program p = new Program();
List<Task> tasks = new List<Task>();
tasks.Add(Task.Factory.StartNew(() => p.SomeLongOperation()));
tasks.Add(Task.Factory.StartNew(() => p.SomeLongOperation()));
var arr = tasks.ToArray();
Stopwatch sw = Stopwatch.StartNew();
Task.WaitAll(arr);
Console.WriteLine("Task wait all results: " + sw.Elapsed);
sw.Stop();
sw = Stopwatch.StartNew();
Parallel.Invoke(() => p.SomeLongOperation(), () => p.SomeLongOperation());
Console.WriteLine("Parallel invoke results: " + sw.Elapsed);
sw.Stop();
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)这是我的处理结果:

编辑:
将代码更改为如下所示:
Program p = new Program();
Task[] tasks …Run Code Online (Sandbox Code Playgroud) 这篇博文提到了新的Task API,包括.NET 4.6中引入的一个新的Task.CompletedTask属性.
为什么要添加?比起比这更好的是什么Task.FromResult(whatever)?
任务什么时候开始?
public void DoSomething() {
Task myTask = DoSomethingAsync();
Task.WaitAll(new[] { myTask }, 2000);
}
public async Task DoSomethingAsync() {
await SomethingElse();
}
Run Code Online (Sandbox Code Playgroud)
它是在初始化时立即Task myTask = DoSomethingAsync();启动还是在您说等待时启动Task.WaitAll(new[] { myTask }, 2000);?
我对使用队列的任务执行感到困惑.我已经阅读了文档,我认为我理解了bucket_size和rate,但是当我将20个任务发送到设置为5/h,大小为5的队列时,所有20个任务尽可能快地执行,最后完成1分钟.
deferred.defer(spam.cookEggs,
egg_keys,
_queue="tortoise")
- name: tortoise
rate: 5/h
bucket_size: 5
Run Code Online (Sandbox Code Playgroud)
我想要的是我是创建10个还是100个任务,我只想要每小时运行5个任务.所以完成需要大约4个小时的20个任务.我希望他们的执行分散开来.
问题是我假设在本地运行时遵循了任务执行率规则,但事实并非如此.您无法在本地测试执行率.当我部署到生产时,我设置的速率和桶大小按我的预期执行.
考虑以下代码:
public void CacheData()
{
Task.Run((Action)CacheExternalData);
Task.Run(() => CacheExternalData());
Task.Run(CacheExternalDataTask);
Task.Run(CacheExternalData);
}
public Task CacheExternalDataTask()
{
// Long running code
return Task.FromResult("Data");
}
public void CacheExternalData()
{
// Long running code
}
Run Code Online (Sandbox Code Playgroud)
为什么Task.Run(CacheExternalData) 模棱两可?而且Task.Run(CacheExternalDataTask)是不是?
当我打电话时Task.Run,CacheExternalData我会认为编译器很清楚该方法没有返回a Task并且应该解析为Action?
task ×10
c# ×8
async-await ×3
.net-4.6 ×1
ant ×1
async-ctp ×1
asynchronous ×1
properties ×1
python ×1
queue ×1