我有一个查询本地数据库并将其发布到web api的任务。此时它占用所有行,将它们分成500块,然后使用异步线程设置同时发布它们。我有另一个工作,偶尔从服务器获取数据,我想如果我返回服务器负载并将其存储在Config.ServerLoad
,它可以在服务器受到重击时稍微分隔一下请求。这是我用来设置我的线程的代码:
var json = JsonConvert.SerializeObject(rowDto);
var threads = new Thread(new ParameterizedThreadStart(MultiThreadPostThead));
var thisThread = new PostParams() { postUrl = postUrl, json = json, callingThread = threads };
threads.Start(thisThread);
threads.IsBackground = true;
ThreadHandles.Add(thisThread);
我希望能添加这样的东西:
thread.delay(Config.ServerLoad * 1000);
例如,如果服务器负载为0.5,则线程之间几乎没有延迟,但如果是10,则在帖子之间等待10秒。我看到了一些关于Task.Delay()
的信息,但没有看到线程的任何内容。有没有我错过的东西有助于添加动态值延迟或设置最大同时线程数?
答案 0 :(得分:1)
如果您想延迟新线程的启动,那么您可以按照
的方式执行某些操作PerformanceCounter cpuCounter;
cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
var thisThread = new PostParams() { postUrl = postUrl, json = json, callingThread = threads };
Thread.Sleep((int)(cpuCounter.NextValue() * 1000));
threads.Start(thisThread);
你可以做的另一件事就是使用
threads.Sleep((int)(cpuCounter.NextValue() * 1000));
因为它是一个线程,所以应该有可用的方法
这应该获取当前的Cpu Usage然后在启动新线程之前暂停当前线程一段时间 - 如果您已经在Config中存储了一个数字,那么您可以放弃执行上下文的东西并将其替换为值你有:)
答案 1 :(得分:0)
我通常不会自己使用线程,但更喜欢你提到的任务。
.Net具有非常直接的异步设计模式;通过声明您的方法异步,您可以定义该方法始终应该在异步上下文中调用。如果您选择使用以下示例,则不必再等待一段时间,而是在完成任务后继续执行异步执行。
public class MyResult {
public string Result;
}
public async void Program() {
var Timeout = 1000;
Task<MyResult> Assignment = GetResult();
// two ways of getting output:
// 1: We wait using the task library
Task.WaitAll(new Task[] { Assignment }, Timeout);
MyResult r1 = Assignment.Result;
// 2: We wait using the async methods:
MyResult r2 = await Assignment;
}
public async Task<MyResult> GetResult() {
// You can find methods which by default is async, therefore not needing to start the task yourself.
return await Task.Factory.StartNew(() => LoadFromDatabase());
}
private MyResult LoadFromDatabase() {
// Just testing.
return new Question1.StartingTasks.MyResult() { Result = "TestResult" };
}
如果您不熟悉异步方法,我建议使用一些简单的类(如本示例)来了解这些方法的行为。
---额外
如果您使用了Task.Delay(时间)但没有成功,则必须记住等待任务完成,例如Task.WaitAll(Task.Delay(500));