타이머를 호출 할 때마다 UpdateDocumentsListFromServer
UI가 3 초 동안 정지합니다. .net 3.5에서 비동기 스타일로 목록을 업데이트하는 방법은 무엇입니까?DispatcherTimer WPF async
뷰 모델 :
public class ShippingDocumentsRegisterViewModel : ViewModelBase
{
ShippingDocumentsModel model = new ShippingDocumentsModel();
DispatcherTimer timer = new DispatcherTimer();
BackgroundWorker BW = new BackgroundWorker();
public ShippingDocumentsRegisterViewModel()
{
timer = new DispatcherTimer();
timer.Tick += new EventHandler(UpdateDocumentsListFromServer);
timer.Interval = new TimeSpan(0, 0, 10);
timer.Start();
this.Columns = model.InitializeColumns();
BW.DoWork += UpdateDocumentsList;
BW.RunWorkerAsync();
}
public void UpdateDocumentsList(object o, EventArgs args)
{
this.ShippingDocuments = model.GetDocuments();
}
public void UpdateDocumentsListFromServer(object o, EventArgs args)
{
// Taking a lot of time. How to do it async?
var tempDocuments = model.GetDocumentsFromServer();
foreach (var item in tempDocuments)
{
this.shippingDocuments.Add(item);
}
//
}
private ObservableCollection<ShippingDocument> shippingDocuments;
public ObservableCollection<ShippingDocument> ShippingDocuments
{
get
{
return shippingDocuments;
}
private set
{
shippingDocuments = value;
RaisePropertyChanged("ShippingDocuments");
}
}
public ObservableCollection<ShippingDocumentColumDescriptor> Columns { get; private set; }
}
이
public ObservableCollection<ShippingDocument> GetDocumentsFromServer()
{
System.Threading.Thread.Sleep(3000);
return new ObservableCollection<ShippingDocument> { new ShippingDocument { Name = "Test" } };
}
'Sleep (3000)'이 있기 때문에 얼어 버립니다. 아마도 바인딩 [IsAsync] (https://msdn.microsoft.com/en-us/library/system.windows.data.binding.isasync (v = vs.110) .aspx)을 설정하려고합니다. 재산이 되겠습니까?) 또 다른 * 옵션은'GetDocumentsFromServer'를'async'로 정의하고 비동기 메소드 (예 :'await Task.Delay()'또는'await Task.Run (() => Thread.Sleep())'를 사용하는 것입니다. 소원). – Sinatr
@Sinatr, 그렇습니다. Sleep (3000) freez UI가 있습니다. 장기간 실행되는 작업을 모방합니다. .net 3.5에는 비동기식 메소드가 없습니다. – A191919
나는 'DispactherTimer' 대신 [Timer] (https://msdn.microsoft.com/en-us/library/zdzx8wx8.aspx)로 갈 것을 제안합니다. 'DispactherTimer'는 스레드 풀에서'Timer' 스레드를 사용하는 UIThread에 접근합니다. – Gopichandar