我是并行编程的新手..NET中有两个类:Task和Thread.
所以,问题是:这些课程有什么区别?何时更好地使用Thread何时Task?
我想问你关于正确架构何时使用的意见Task.Run.我在WPF .NET 4.5应用程序(使用Caliburn Micro框架)中遇到了滞后的UI.
基本上我在做(非常简化的代码片段):
public class PageViewModel : IHandle<SomeMessage>
{
...
public async void Handle(SomeMessage message)
{
ShowLoadingAnimation();
// Makes UI very laggy, but still not dead
await this.contentLoader.LoadContentAsync();
HideLoadingAnimation();
}
}
public class ContentLoader
{
public async Task LoadContentAsync()
{
await DoCpuBoundWorkAsync();
await DoIoBoundWorkAsync();
await DoCpuBoundWorkAsync();
// I am not really sure what all I can consider as CPU bound as slowing down the UI
await DoSomeOtherWorkAsync();
}
}
Run Code Online (Sandbox Code Playgroud)
从我阅读/看到的文章/视频中,我知道await async不一定在后台线程上运行,并且需要在后台开始工作,需要等待它Task.Run(async () => …
我有一个async不返回任何数据的方法:
public async Task MyAsyncMethod()
{
// do some stuff async, don't return any data
}
Run Code Online (Sandbox Code Playgroud)
我从另一个返回一些数据的方法调用它:
public string GetStringData()
{
MyAsyncMethod(); // this generates a warning and swallows exceptions
return "hello world";
}
Run Code Online (Sandbox Code Playgroud)
在MyAsyncMethod()没有等待的情况下进行呼叫会导致" 因为此呼叫未被等待,当前方法在呼叫完成之前继续运行 "在visual studio中发出警告.在该警告的页面上,它指出:
只有当您确定不想等待异步调用完成并且被调用的方法不会引发任何异常时,才应考虑禁止警告.
我确定我不想等待电话完成; 我不需要或没有时间.但这一呼吁可能引发例外.
我偶然发现了这个问题几次,我确信这是一个必须有共同解决方案的常见问题.
如何在不等待结果的情况下安全地调用异步方法?
对于那些建议我等待结果的人来说,这是响应我们的Web服务(ASP.NET Web API)上的Web请求的代码.在UI上下文中等待保持UI线程空闲,但是在Web请求调用中等待将在响应请求之前等待任务完成,从而无缘无故地增加响应时间.
我正在尝试创建自定义rake任务,但似乎我无法访问我的模型.我认为这是rails任务中隐含的内容.
我在lib/tasks/test.rake中有以下代码:
namespace :test do
task :new_task do
puts Parent.all.inspect
end
end
Run Code Online (Sandbox Code Playgroud)
这是我的父模型的样子:
class Parent < ActiveRecord::Base
has_many :children
end
Run Code Online (Sandbox Code Playgroud)
这是一个非常简单的例子,但我收到以下错误:
/> rake test:new_task
(in /Users/arash/Documents/dev/soft_deletes)
rake aborted!
uninitialized constant Parent
(See full trace by running task with --trace)
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?谢谢
是否有一种"标准"方式来指定任务延续应该在创建初始任务的线程上运行?
目前我有下面的代码 - 它正在工作,但跟踪调度程序和创建第二个动作似乎是不必要的开销.
dispatcher = Dispatcher.CurrentDispatcher;
Task task = Task.Factory.StartNew(() =>
{
DoLongRunningWork();
});
Task UITask= task.ContinueWith(() =>
{
dispatcher.Invoke(new Action(() =>
{
this.TextBlock1.Text = "Complete";
}
});
Run Code Online (Sandbox Code Playgroud) 如何在不知道task_id每个任务的情况下删除所有待处理任务?
在C#和TPL(任务并行库)中,Task该类表示正在进行的工作,它产生类型为T的值.
我想知道Task.FromResult方法有什么需要?
那就是:在您已经拥有生产价值的情况下,需要将其包装回任务中?
我唯一想到的是它被用作接受Task实例的其他方法的一些适配器.
在一个线程中,我创建一些System.Threading.Task并启动每个任务.
当我做一个.Abort()杀死线程时,任务不会中止.
我怎样才能传递.Abort()给我的任务?
我在一个有点大的Web应用程序上工作,后端主要是在PHP中.代码中有几个地方我需要完成一些任务,但我不想让用户等待结果.例如,在创建新帐户时,我需要向他们发送欢迎电子邮件.但是当他们点击"完成注册"按钮时,我不想让他们等到实际发送电子邮件,我只想启动该过程,并立即向用户返回消息.
到目前为止,在某些地方,我一直在使用exec()感觉像是一个黑客.基本上做的事情如下:
exec("doTask.php $arg1 $arg2 $arg3 >/dev/null 2>&1 &");
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但我想知道是否有更好的方法.我正在考虑编写一个在MySQL表中排队任务的系统,以及一个单独的长时间运行的PHP脚本,每秒查询一次该表,并执行它找到的任何新任务.如果需要的话,这也有可能让我将来在几台工作机器之间拆分任务.
我是在重新发明轮子吗?有没有比exec()hack或MySQL队列更好的解决方案?
在我使用Eclipse的这些年里,我从未知道TODO/FIXME/XXX注释标签应该出现在任务列表中.显然这是默认禁用的东西,因为我一直在使用这些标签,只要我一直在使用Eclipse,我从未见过其中一个出现在任务列表中.任何人都可以指出如何启用此功能?我看到没有任何偏好选项可以说明"让我的源代码标签出现在任务列表中"的效果.如果它存在,这将是一个很好的功能,但我开始怀疑.
我已经四处询问了,正如其他人向我建议的那样,这些东西显然没有任何效果,但我还是试过了:
我正在使用:
面向Web开发人员的Eclipse Java EE IDE.
版本:Helios Service Release 1
Build id:20100917-0705
task ×10
c# ×6
.net ×4
async-await ×3
asynchronous ×2
abort ×1
activerecord ×1
background ×1
celery ×1
celery-task ×1
eclipse ×1
exception ×1
php ×1
queue ×1
rabbitmq ×1
rake ×1
tags ×1
wpf ×1