我从一个函数开始一个新的任务,但我不希望它在同一个线程上运行。 我不关心它运行在哪个线程,只要它是一个不同的线程(所以在这个问题给出的信息不起作用)。 我保证,下面的代码将总是退出TestLock之前允许Task t再次进入它? 如果不是,build议的devise模式是什么,以防止重复? object TestLock = new object(); public void Test(bool stop = false) { Task t; lock (this.TestLock) { if (stop) return; t = Task.Factory.StartNew(() => { this.Test(stop: true); }); } t.Wait(); } 编辑:根据Jon Skeet和Stephen Toub的下面的答案,确定性地防止重入的一个简单方法是传递一个CancellationToken,如下面的扩展方法所示: public static Task StartNewOnDifferentThread(this TaskFactory taskFactory, Action action) { return taskFactory.StartNew(action: action, cancellationToken: new CancellationToken()); }
我刚刚开始在.Net 4.0中查看新的“System.Threading.Tasks”的好处,并想知道是否有任何构build支持限制一次运行的并发任务的数量,或者如果这应该手动处理。 EG:如果我需要调用100次计算方法,有没有办法设置100个任务,但是只能同时执行5个? 答案可能只是创build5个任务,调用Task.WaitAny,并创build一个新的任务,每个前一个完成。 如果还有更好的方法,我只想确保我不会错过任何一个技巧。 基本上,是否有内置的方式来做到这一点: Dim taskArray() = {New Task(Function() DoComputation1()), New Task(Function() DoComputation2()), … New Task(Function() DoComputation100())} Dim maxConcurrentThreads As Integer = 5 RunAllTasks(taskArray, maxConcurrentThreads) 感谢您的帮助。
我在这里发现了类似的问题,但没有答案让我满意。 因此,再次重述这个问题 – 我有一个任务需要定期完成(比如每隔1分钟)。 使用Timertask和Timer来做这件事,而不是创build一个带有睡眠的无限循环的新线程,有什么好处呢? 使用timertask- TimerTask uploadCheckerTimerTask = new TimerTask(){ public void run() { NewUploadServer.getInstance().checkAndUploadFiles(); } }; Timer uploadCheckerTimer = new Timer(true); uploadCheckerTimer.scheduleAtFixedRate(uploadCheckerTimerTask, 0, 60 * 1000); 使用Thread和sleep- Thread t = new Thread(){ public void run() { while(true) { NewUploadServer.getInstance().checkAndUploadFiles(); Thread.sleep(60 * 1000); } } }; t.start(); 如果逻辑的执行时间超过间隔时间,我就不必担心是否会错过某些周期。 请评论这个.. 谢谢, -Keshav 更新: 最近我发现使用Timer与Thread.sleep()之间的另一个区别。 假设当前的系统时间是上午11:00。 […]
我想问你关于何时使用Task.Run的正确架构的Task.Run 。 我在WPF .NET 4.5应用程序(Caliburn Micro框架)中遇到了laggy 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 […]
我不熟悉并行编程。 .NET中有两个类: Task和Thread 。 所以,问题是:这些类之间有什么区别? 什么时候使用Thread和Task时更好?
在一个线程中,我创build了一些System.Threading.Task并开始每个任务。 当我做.Abort()来杀死线程时,任务不会中止。 如何将.Abort()传输到我的任务?
我有以下四个testing,最后一个挂起时,我运行它,我的问题是为什么会发生这种情况: [Test] public void CheckOnceResultTest() { Assert.IsTrue(CheckStatus().Result); } [Test] public async void CheckOnceAwaitTest() { Assert.IsTrue(await CheckStatus()); } [Test] public async void CheckStatusTwiceAwaitTest() { Assert.IsTrue(await CheckStatus()); Assert.IsTrue(await CheckStatus()); } [Test] public async void CheckStatusTwiceResultTest() { Assert.IsTrue(CheckStatus().Result); // This hangs Assert.IsTrue(await CheckStatus()); } private async Task<bool> CheckStatus() { var restClient = new RestClient(@"https://api.test.nordnet.se/next/1"); Task<IRestResponse<DummyServiceStatus>> restResponse = restClient.ExecuteTaskAsync<DummyServiceStatus>(new […]
我工作在一个有点大的Web应用程序,而后端主要是在PHP中。 代码中有几个地方需要完成一些任务,但我不想让用户等待结果。 例如,在创建新帐户时,我需要向他们发送一封欢迎邮件。 但是,当他们点击“完成注册”按钮时,我不想让他们等到电子邮件实际发送,我只是想启动过程,并立即返回一个消息给用户。 直到现在,在一些地方,我一直在用exec()来进行攻击。 基本上做这样的事情: exec("doTask.php $arg1 $arg2 $arg3 >/dev/null 2>&1 &"); 这似乎工作,但我想知道如果有更好的办法。 我正在考虑编写一个在MySQL表中排队任务的系统,以及一个单独的长时间运行的PHP脚本,每秒查询一次这个表,并执行它找到的任何新任务。 如果需要的话,这也可以让我在未来的几个工人机器之间分配任务。 我正在重新发明轮子吗? 有没有比exec()黑客或MySQL队列更好的解决方案?