【问题标题】:C# Async void doesn't execute all linesC# Async void 不执行所有行
【发布时间】:2020-01-05 19:26:19
【问题描述】:

我有问题。我创建了这个异步 void:

private async void AddImageToPreview(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
    if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
    {
        var image = (Image)e.NewItems[e.NewItems.Count - 1];

        var httpClient = new System.Net.Http.HttpClient();
        var bytes = await httpClient.GetByteArrayAsync("mysite.org/" + App.TemplateSource + (string)e.NewItems[e.NewItems.Count - 1]);
        Stream stream = new MemoryStream(bytes);

        bitmap = SKBitmap.Decode(stream);

        float x = (float)MemeCanvas.Width / 2;
        float y = (float)MemeCanvas.Height / 2;

        int NewDictionaryKey = SelectedMemeTemplateIDs.Count;
        MemesOnCanvas NewMeme = new MemesOnCanvas
        {
            //ResourceID = resourceID
        };

        SelectedMemeTemplateIDs.Add(NewDictionaryKey, NewMeme);
        UpdateMemeTemplateCollection();
        MemeCanvas.InvalidateSurface();                
    }
}

我用这条线调用:

HomePage.SelectedMemeCollection.CollectionChanged += AddImageToPreview;

现在我在该空白处的第一行设置了一个断点:var image = (Image)e.NewItems[e.NewItems.Count - 1];,该点被命中,但是当我在第二行设置断点:var httpClient = new System.Net.Http.HttpClient(); 时,它永远不会被命中......

我做错了什么?

【问题讨论】:

  • 你用的是什么版本的visual studio?
  • 另外,我看到您将e.NewItems[e.NewItems.Count - 1] 转换为Image 和string,您的收藏实际上包含什么?
  • 如果 var image = (Image)e.NewItems 引发异常并且您没有在 VS 中打开 catch unhanded exception option 是可能的。请将其更改为var image = e.NewItems.LastOrDefault(); 并重试。在下一行中,您将 e.NewItems 项目转换为字符串 (string)e.NewItems[e.NewItems.Count - 1] - 它不起作用。
  • 太棒了。您应该能够通过输入e.NewItems[e.NewItems.Count - 1].Value 来检索您的图像,并通过输入e.NewItems[e.NewItems.Count - 1].Key 来检索您的文件路径。
  • 这是重要的一行 CollectionChanged (this, new NotifyCollectionChangedEventArgs (NotifyCollectionChangedAction.Add, new KeyValuePair<TKey, TValue> (key, value))); 您正在使用 new KeyValuePair 调用该事件。因此,要在事件处理程序中获取图像和字符串,您必须执行 var pair = (KeyValuePair<string, Image>) e.NewItems.Last(); var image = pair.Value; var path = pair.Key;

标签: c# asynchronous


【解决方案1】:

自定义字典实现使用包含KeyValuePair<TKey, TValue> 列表的事件调用事件处理程序。要检索最后添加的元素,您必须执行以下操作:

var pair = (KeyValuePair<string, Image>) e.NewItems.Last();
var path = pair.Key;
var image = pair.Value;

【讨论】:

    【解决方案2】:

    您必须检查 e.NewItems 集合中存储的内容

    如果var image = (Image)e.NewItems[] 引发异常并且您没有在VS 中打开catch unhanded exception option,则有可能。

    请将其更改为var image = e.NewItems.LastOrDefault();,然后重试。

    在下一行中,您将 e.NewItems[] 项目转换为字符串 (string)e.NewItems[e.NewItems.Count - 1] - 它肯定不会起作用

    请检查 e.NewItems 中存储的内容,以确保您正确投射。

    var item = e.NewItems.LastOrDefault() 的项目类型是什么?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-08
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2021-10-19
      • 2016-11-13
      相关资源
      最近更新 更多