相关疑难解决方法(0)

Task.Factory.StartNew()是否保证使用另一个线程而不是调用线程?

我从一个函数开始一个新的任务,但我不希望它在同一个线程上运行.我不关心它运行在哪个线程上,只要它是一个不同的线程(因此这个问题中给出的信息没有帮助).

我保证TestLock在允许Task t再次输入之前,以下代码将始终退出吗?如果没有,建议的设计模式是什么来防止再次出现?

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();
}
Run Code Online (Sandbox Code Playgroud)

编辑:基于Jon Skeet和Stephen Toub的以下答案,确定性地防止重入的一种简单方法是传递CancellationToken,如此扩展方法所示:

public static Task StartNewOnDifferentThread(this TaskFactory taskFactory, Action action) 
 {
    return taskFactory.StartNew(action: action, cancellationToken: new CancellationToken());
}
Run Code Online (Sandbox Code Playgroud)

c# multithreading locking task task-parallel-library

74
推荐指数
1
解决办法
3万
查看次数

降低Task.Factory.StartNew线程的优先级

像下面这样的代码将启动一个新线程来完成这项工作.有什么方法可以控制该线程的优先级吗?

Task.Factory.StartNew(() => {
    // everything here will be executed in a new thread.
    // I want to set the priority of this thread to BelowNormal
});
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading .net-4.0 taskfactory

35
推荐指数
4
解决办法
4万
查看次数

更改线程池线程的文化是否会在它返回池时影响它?

如果我设置CurrentCulture线程池线程,当线程完成执行并返回到线程池时会发生什么?它是否CurrentCulture重置为默认值(无论可能意味着什么),还是会保留我在其上设置的文化?

我希望框架将线程重置为默认状态以防止这种情况,但是找不到任何这种效果的文档.我找到的最接近的是来自ThreadPool的MSDN文档:

当线程池重用线程时,它不会清除线程本地存储中或使用ThreadStaticAttribute属性标记的字段中的数据.因此,通过一个方法放置在线程本地存储中的数据可以暴露给由同一线程池线程执行的任何其他方法.

这似乎表明线程在返回时没有重置.

我已经尝试了一些示例代码来尝试对此进行测试,并且看起来确实重置了文化,但我不相信我正在测试这种行为,因为我认为我只使用了ThreadPool的一小部分线程,并且所以不能确定我正在测试一个已经拥有它的文化集的线程.

c# multithreading currentculture threadpool

7
推荐指数
1
解决办法
2436
查看次数

"节流"功能

我正在开发一个MMORPG游戏服务器,而游戏服务器中80%的功能不需要这种方法,使用它的20%的功能占资源使用的99%.

我正在尝试完成一个限制功能.假设您调用了一个庞大的函数,或者您正在搜索特定条件的海量数据结构.被激活的一个调用可能导致大量CPU使用.

例如,一个庞大的功能,当被调用时,使用稳定的30%的CPU在4秒内完成,比如我们按照标准在拍卖系统中搜索数百万个条目.想象一下,我们有4个人同时这样做.我想制作相同的方法,只占用1%或更少的CPU,可能需要超过15-20秒才能返回相同的结果而不会使硬件匮乏.

截至目前我正在使用这个课程.

public class AsyncLazy<T> : Lazy<Task<T>> 
{ 
    public AsyncLazy(Func<T> valueFactory) : 
        base(() => Task.Factory.StartNew(valueFactory)) { }
    public AsyncLazy(Func<Task<T>> taskFactory) : 
        base(() => Task.Factory.StartNew(() => taskFactory()).Unwrap()) { } 
}
Run Code Online (Sandbox Code Playgroud)

这不会阻止值的初始化,并且在使用惰性值时不会阻塞.但是,在大规模操作期间,执行操作会使硬件无法完成任务,从而导致4秒内CPU使用率达到30%.我的目标是在几乎无限的时间内限制呼叫,这样他们就可以在不使硬件匮乏的情况下完成任务.

编辑:感谢Scott Chamberlin用正确的"行话"来纠正我.我不打算懒洋洋地调用一个方法,但我正在寻找"Throttle"特定的方法调用.

.net c# c#-5.0

7
推荐指数
1
解决办法
749
查看次数