据我所知,我有一些误导性的信息.我需要在后台运行一个单独的线程.
目前我这样做:
var task = Task.Factory.StartNew
(CheckFiles
, cancelCheckFile.Token
, TaskCreationOptions.LongRunning
, TaskScheduler.Default);//Check for files on another thread
private void CheckFiles()
{
while (!cancelCheckFile.Token.IsCancellationRequested)
{
//do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
这总是为我创建一个新线程.但经过多次讨论后,即使将其标记为LongRunning也无法保证将创建新的线程.
在过去我做过这样的事情:
thQueueChecker = new Thread(new ThreadStart(CheckQueue));
thQueueChecker.IsBackground = true;
thQueueChecker.Name = "CheckQueues" + DateTime.Now.Ticks.ToString();
thQueueChecker.Start();
private void CheckQueue()
{
while (!ProgramEnding)
{
//do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
你会建议我回到这种方法来保证使用新线程吗?
我遇到了HttpClient和异步请求的问题.基本上我有一个异步方法,即使用在ctor中初始化的共享HttpClient创建异步请求.
我的问题是,当以异步方式调用我的方法时,似乎HttpClient阻塞.
这是我的调用代码:
var tasks = trips.Select(u => api.Animals.GetAsync(u * 100, 100).ContinueWith(t =>
{
lock (animals)
{
if (t.Result != null)
{
foreach (var a in t.Result)
{
animals.Add(a);
}
}
}
}));
await Task.WhenAll(tasks);
Run Code Online (Sandbox Code Playgroud)
以下是使用共享HttpClient阻塞的方法:
//HttpClient blocks on each request
var uri = String.Format("animals?take={0}&from={1}", take, from);
var resourceSegmentUri = new Uri(uri, UriKind.Relative);
var response = await _client.GetAsync(resourceSegmentUri);
if (response.IsSuccessStatusCode)
{
var content = await response.Content.ReadAsStringAsync();
var animals = JsonConvert.DeserializeObject<T>(content);
return animals;
}
Run Code Online (Sandbox Code Playgroud)
当为每个请求使用客户端时,此代码段不会阻止:
using (var client = new HttpClient(){BaseAddress …Run Code Online (Sandbox Code Playgroud)