相关疑难解决方法(0)

使用Task.StartNew方法时如何保证创建新线程

据我所知,我有一些误导性的信息.我需要在后台运行一个单独的线程.

目前我这样做:

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)

你会建议我回到这种方法来保证使用新线程吗?

.net c# multithreading .net-4.0 task-parallel-library

13
推荐指数
3
解决办法
4933
查看次数

共享HttpClient阻止异步请求

我遇到了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)

.net c# multithreading asynchronous

5
推荐指数
1
解决办法
694
查看次数