正确使用委托和异步方法

时间:2017-11-10 10:20:12

标签: c# .net wpf delegates dispatcher

这是一个简单的应用程序,它有一个按钮从服务器获取数据,然后在UI中更新文本。 另外,我想启动另一个线程,每隔3秒再次获取数据。 以下代码是创建线程和更新UI(绑定值)的正确方法吗? 在这种情况下,委托NoArgDelegate的使用是否有缺点?或者在委托中传递异步方法是个坏主意?我仍然试图获得委托和Dispatcher的概念。

    private delegate void NoArgDelegate();
    public IAsyncCommand GetDataCommand { get; private set; } // binding for a "Get data" button

    public JustAViewModel()
    {
        // ...
        GetDataCommand = AsyncCommand.Create(() => GetDataAsync());

        var fetcher = new NoArgDelegate(ContinuouslyFetchData);
        fetcher.BeginInvoke(null, null);
    }

    public string Value // in xaml: TextValue="{Binding Value}" 
    {
        get => _value;
        set
        {
            if (_value != value)
            {
                _value = value;
                RaisePropertyChanged("Value");
            }
        }
    }

    private async void ContinuouslyFetchData()
    {
        while (true)
        { 
            System.Threading.Thread.Sleep(3000);
            await GetDataAsync();
        }
    }

    private async Task<string> GetDataAsync()
    {
        Value = await Task.Run(() => DataProvider.GetData());
        return Value;
    }

1 个答案:

答案 0 :(得分:1)

你误解了.Select()的作用。它不会创建新线程。

但是,你不应该创建一个线程。对于循环重复操作,请使用计时器。

我建议eComplex = eComplexesSet .Cast<EnergeticalComplex>() .Where(ec => ec.Field.Id == fieldId && !ec.Name.Contains("KTP")) .Select(m=> new { VariableName = m.ModelVariableName, // Same for elements which you needed for }); 使用异步BeginInvoke事件处理程序:

DispatcherTimer