标签: task

如何从非异步代码中获取有关未等待任务的警告

如果我忘记等待从非异步方法中的异步方法返回的任务,我不会收到警告。由于未观察到的异常,这导致我的代码中存在一些未被发现的错误。

如果调用方法是异步的,我确实会收到警告,但如果调用方法是非异步的,我会收到同样的警告。

我知道您不能等待非异步方法,解决方法是使调用方法异步,然后等待它。但我想要一个警告,让我知道我应该这样做。

在这种情况下,有没有办法让 c# 编译器生成警告?

未等待的任务缺少警告

.net c# task async-await

0
推荐指数
1
解决办法
132
查看次数

TaskScheduler.Current何时是UI TaskScheduler?

在这篇文章中,Stephen 描述了在外部 StartNew(参见下面的代码片段)中,TaskScheduler.Current 是我们的 UI 任务调度程序。事实上,下面代码的输出似乎表明所有内容都是在 UI 线程上执行的。然而,当我尝试确认这一点时,我得到了不同的答案:

private void Button_Click(object sender, RoutedEventArgs e)
{
    var uiTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext();
    var ui = new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext());
    ui.StartNew(() =>
    {
        Debug.WriteLine("TaskScheduler.Current == UI TaskScheduler: " + (uiTaskScheduler == TaskScheduler.Current));
        Debug.WriteLine("UI on thread " + Environment.CurrentManagedThreadId);
        Task.Factory.StartNew(() =>
        {
            Debug.WriteLine("Background work on thread " + Environment.CurrentManagedThreadId);
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

和输出:

TaskScheduler.Current == UI TaskScheduler: False
UI on thread 1
Background work on thread 1
Run Code Online (Sandbox Code Playgroud)

为什么会uiTaskScheduler == TaskScheduler.Current返回 false?

c# wpf task task-parallel-library

0
推荐指数
1
解决办法
80
查看次数

为什么 Task.WhenAll 不等待完成?

我在这里遇到了一个问题,你可能知道答案:我只是仍然无法弄清楚。

我在这里为一个简单的场景创建一个种子:为给定的帖子添加“喜欢”。方法签名是:

async Task GeneratePostLike(string postId, string userId, CancellationToken cancellationToken = default) {
    return await postLikeService.AddUserLikeToPost(
      new PostLikeInput { PostId = postId, UserId = userId },
      cancellationToken
    );
}
Run Code Online (Sandbox Code Playgroud)

我想随机生成对帖子的点赞。我正在使用随机和其他机制来获取随机数来执行此操作。

当我使用旧的 for 循环块时,它会按照我想要的方式执行。这是我正在使用的说明:

var numberOfLikesForPost = random.Next(1, 100);
var randomUsersForLikes = await userService.GetRandomUsers(numberOfLikesForPost);

for (var likeIndex = 0; likeIndex < numberOfLikesForPost; likeIndex++)
{
  var randomUserId = randomUsersForLikes.PickRandom().Id;
  await GeneratePostLike(post.Id!, randomUserId, cancellationToken);
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但是,当我尝试使用 时Task.WhenAll,它只是执行一两次迭代并继续。看起来它的行为就像某种“一劳永逸”的行为。以下代码代表了我对Task.WhenAll块所做的事情:

var numberOfLikesForPost = random.Next(1, 100);
var randomUsersForLikes = await userService.GetRandomUsers(numberOfLikesForPost);

var generatePostLikeTasks …
Run Code Online (Sandbox Code Playgroud)

c# linq task task-parallel-library async-await

0
推荐指数
1
解决办法
90
查看次数

为什么我的WCF服务器这么慢

我已经创建了一个WCF服务器和一个WCF客户端来使用该服务.服务器的目的是添加2个传入的数字,并在返回总和之前等待X毫秒.

客户端创建Y任务并启动它们.每个任务都是服务器添加数字并等待X毫秒的请求.

当x = 0且y = 1000时,完成所有任务平均需要6.2秒.当X = 0且Y = 10000时,平均需要61秒来完成所有任务.

为什么这么慢或者这可能是正常的?

谢谢达莫

客户端C#方法

private void radButtonTaskWithStatus_Click(object sender, EventArgs e)
        {
            try
            {
                var dateTime1 = DateTime.UtcNow;
                radProgressBarStatus.Maximum = int.Parse(radTextBoxFloodRequests.Text);
                radProgressBarStatus.Value1 = 0;

                Random rnd = new Random();


                Task<int>[] tasks = new Task<int>[int.Parse(radTextBoxFloodRequests.Text)];

                for (int i = 0; i < int.Parse(radTextBoxFloodRequests.Text); i++)
                {
                    int x = i;
                    tasks[i] = new Task<int>(() =>
                    {    

                        int FirstRandomNumber = rnd.Next(1, 20);
                        int SecondRandomNumber = rnd.Next(1, 20);


                        int result = TaskRequestWithResult(FirstRandomNumber, SecondRandomNumber, int.Parse(radTextBoxFloodDelay.Text), x); …
Run Code Online (Sandbox Code Playgroud)

c# performance wcf task wcf-binding

-1
推荐指数
1
解决办法
892
查看次数

C#任务不是任务

我正在实现一个接口

Task Something()
Run Code Online (Sandbox Code Playgroud)

但是实现中的代码都不是异步的

Task Something(){
    var x=1;
    return null;
}
Run Code Online (Sandbox Code Playgroud)

这当然会在调用时导致错误:

await Something()
Run Code Online (Sandbox Code Playgroud)

如何发回空白任务以使界面满意?

c# task

-1
推荐指数
1
解决办法
92
查看次数

C#async不等待

我正在处理的应用程序应该使用http客户端检索json字符串,然后在应用程序中进行反序列化并使用它.

一切正常,除了等待功能.我做错了什么,我似乎无法弄清楚是什么.我如何确保我的DataService类等待,直到我有我的json并且它已被反序列化?

DataService类:

class DataService : IDataService
{
    private IEnumerable<Concert> _concerts;

    public DataService()
    {
        _concerts = new DataFromAPI()._concerts;

        Debug.WriteLine("____Deserialization should be done before continuing____");

        **other tasks that need the json**

    }
}
Run Code Online (Sandbox Code Playgroud)

我的http客户端类:

class DataFromAPI
{

    public IEnumerable<Concert> _concerts { get; set; }

    public DataFromAPI()
    {
        Retrieve();
    }

    public async Task Retrieve()
    {
        try
        {
            HttpClient client = new HttpClient();
            HttpRequestMessage request = new HttpRequestMessage();
            var result = await client.GetAsync(new Uri("http://url-of-my-api"), HttpCompletionOption.ResponseContentRead);
            string jsonstring = await result.Content.ReadAsStringAsync();
            DownloadCompleted(jsonstring);
        }
        catch …
Run Code Online (Sandbox Code Playgroud)

c# json asynchronous task async-await

-1
推荐指数
1
解决办法
889
查看次数

如何同时执行多个异步任务

我对此代码感到困惑.根据包含此代码的文档,它会调用允许它们同时执行的每个任务,然后等待它们都完成.

我不明白执行的顺序是如何运作的.通过声明任务var firstTask = DoSomethingAsync();会导致任务开始执行吗?我认为没有await表达式它是同步的.

public async Task RunConcurrentTasks()
{
    var firstTask = DoSomethingAsync();
    var secondTask = DoSomethingElseAsync();

    await firstTask;
    await secondTask;
} 
Run Code Online (Sandbox Code Playgroud)

此外,此代码是否实现了相同的结果?

public async Task RunConcurrentTasks()
{
    var firstTask = DoSomethingAsync();
    var secondTask = DoSomethingElseAsync();

    await Task.WhenAll(firstTask, secondTask);
}
Run Code Online (Sandbox Code Playgroud)

c# asynchronous task

-1
推荐指数
1
解决办法
629
查看次数

Backgroundworker阻止Pageload

我正在尝试从Entity Framework加载大量数据.请求大约需要一分钟,并阻止页面加载.由于这对于较大的查询变得不合理,我想我会尝试使用后台线程或类似的东西.经过一段时间的研究,我找到了一种名为BackgroundWorker的东西.我试图实现这个但它不起作用.这是我的代码:

  void Page_LoadComplete(object sender, EventArgs e)
    {
        InitializeBackgroundWorker();
    }

    private void InitializeBackgroundWorker()
    {
        bw = new BackgroundWorker {WorkerReportsProgress = true};


        bw.DoWork += (sender, e) => e.Result = (List<object>)e.Argument;
        bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
        bw.RunWorkerAsync(doSomething());

        bw.RunWorkerCompleted += (sender, e) =>
        {
            AjaxWaitBox.Text = "Completed";
        };
    }
        private readonly Func<List<object>> doSomething = () =>
    {

        var list = ObjectFactory.Container.GetInstance<IActivityRepository>().GetAllActivitiesNotFiltered(ContentReference.RootPage);
        var count = list.Count;
        int i = 0;
        foreach (var item in list)
        {
            i++;
            Console.WriteLine("-(DoWork)->" + i);
            double percentage = (Convert.ToDouble(i) / …
Run Code Online (Sandbox Code Playgroud)

c# multithreading task backgroundworker async-await

-1
推荐指数
1
解决办法
167
查看次数

停止多个任务

我正在使用以下方法创建新任务并长时间在后台执行操作.如果满足某个条件,我需要完全停止所有任务并向用户显示消息.

dowork()
{

    mylist = new List<DataModel.CheckData>();
    int index = 0;
    foreach (var line in mylist)
    {
        mylist.Add(new DataModel.CheckData() { RawLine = line, data = line,FileName=virtualfilelist[index].ToString() });
        index++;
    }

    BlockingCollection<DataModel.CheckData> ujobs = new BlockingCollection<DataModel.CheckData>();
    timerRefreshUi.Start();

    Task.Factory.StartNew(() =>
    {
        _dtRows.Clear();
        uiQueue.Clear();
        uiQueueBad.Clear();
        uiQueueGood.Clear();

        for (int i = 0; i < mylist.Count; i++)
        {
             AddResultRow(mylist[i].data, "Waiting...",mylist[i].FileName, Color.White);
             ujobs.TryAdd(new DataModel.CheckData() { RowId = i, data = mylist[i].data }, 1000);

         }
         List<Task> openCheckTasks = new List<Task>();

         while (ujobs.Count > 0)
         {
             while (openCheckTasks.Where(task => …
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading task winforms

-1
推荐指数
1
解决办法
534
查看次数

返回多个异步任务时,我如何知道哪个结果来自哪个任务?

我有以下代码来运行多个异步任务并等待所有结果。

string[] personStoreNames = _faceStoreRepo.GetPersonStoreNames();    
IEnumerable<Task<IdentifyResult[]>> identifyFaceTasks =
        personStoreNames.Select(storename => _faceServiceClient.IdentifyAsync(storename, faceIds, 1));
      var recognitionresults =
        await Task.WhenAll(identifyFaceTasks);
Run Code Online (Sandbox Code Playgroud)

当我得到结果时,如何获得每个任务结果的商店名称。IdentifyResult的每个数组都将用于特定的商店名称,但是我不确定如何以IdentifyResults及其在其中找到的商店名称结尾。

c# task async-await

-1
推荐指数
1
解决办法
51
查看次数