private async Task ProcessServerMessage(NetworkStream stream) { switch (await stream.ReadObjAsync(ReportProgress)) { case TrackMetadata[] metas: var items = metas.Select(x => new ListViewItem(x.ListItem)).ToArray(); Dispatcher.Post(() => { lvRemoteList.Items.Clear(); lvRemoteList.Items.AddRange(items); }); break; case FileBlob file: var repo = await Dispatcher.Send(() => TbPath.Text); var path = Path.Combine(repo, file.Name); var preExists = File.Exists(path); try { using (FileStream fs = File.Create(path)) { await fs.WriteAsync(file.Body, 0, file.Body.Length).ContinueWith(async t => { await t; fs.Close(); if (!preExists) { Dispatcher.Post(() => { var meta = CommonBehavior.GetMetadata(Wmp, path); Playlist.Add(new ListViewItem(meta.ListItem) { Tag = meta }); }); } }).ConfigureAwait(false); } } catch (Exception e) { MessageBox.Show(e.Message); } ServerMessage = null; Dispatcher.Post(() => { Text = "Music Player Client"; }); break; case Announcement msg: ServerMessage = msg.Message; ReportProgress(0); break; } }