public WaitForMany(int n) { wait = joiner.NewSyncMethod(Wait); signal = joiner.NewAsyncMethod(Signal); (wait & n * signal).Do(() => { }); }
/// <summary> /// 非同期実行。 /// </summary> /// <param name="method">非同期メソッド。</param> public void Execute(AsyncMethod method) { _invokeCount++; this.BeginInvoke((MethodInvoker) delegate { method(); _invokeCount--; if (_isCloseMode && _invokeCount == 0) { DisposeCore(); } }); }
// true=成功,false=失败,null=取消 private async Task <bool?> _SaveAsync() { bool?result = null; if (_Saved) { if (File.Exists(Entrance.FileName)) { // 当且仅当已经保存且文件存在,才认为不需要(重新)保存且保存成功 result = true; } // 如果文件已经保存,但不存在(被删除/移动存储介质弹出),那么重新保存 else { result = await AsyncMethod.SaveAsync(); // 如果保存失败,那么另存为 if (!result.Value) { bool?r = _SaveFileDialog.ShowDialog(); if (r ?? false) { result = await AsyncMethod.SaveAsAsync(_SaveFileDialog.FileName); } } } } else { if (!string.IsNullOrEmpty(Entrance.FileName)) { result = await AsyncMethod.SaveAsync(); } // 首次保存等同于另存为 else { bool?r = _SaveFileDialog.ShowDialog(); if (r ?? false) { result = await AsyncMethod.SaveAsAsync(_SaveFileDialog.FileName); } } } _Saved = result ?? false; return(result); }
public AsyncBuffer() { #region initialization joiner = new Joiner(); get = joiner.NewSyncMethod <T>(Get); put = joiner.NewAsyncMethod <T>(Put); #endregion (get & put).Do((T t) => { Log.Trace("Match 'get & put': passing " + t + " from Put to Get"); return(t); }); }
// true=成功,false=失败,null=取消 private async Task <bool?> _SaveAsAsync() { bool?result = null; bool?r = _SaveFileDialog.ShowDialog(); if (r ?? false) { result = await AsyncMethod.SaveAsAsync(_SaveFileDialog.FileName); } _Saved = result ?? false; return(result); }
/// <summary> /// Initiates an asynchronous call of the specified method with the specified parameters. /// </summary> /// <param name="method">The method to call.</param> /// <param name="parameters">The parameters to use when calling the method.</param> public static void Call(AsyncMethod method, params object[] parameters) { if (method == null) { throw new ArgumentException("Invalid method specified!"); } var asyncCall = new AsyncCall() { Method = method, Parameters = parameters }; if (ThreadPool.QueueUserWorkItem(new WaitCallback(ExecuteAsyncCall), asyncCall) == false) { asyncCall.Error("Asynchronous execution of method '{0}' failed!", method.Method.Name); } }
public AsyncBuffer() { joiner = new Joiner(); // initialize and register the Method instances // with the Jointer get = joiner.NewSyncMethod <T>(Get); put = joiner.NewAsyncMethod <T>(Put); // combine the Methods to define patterns/chords the code in // the lambda will be invoked whenever there is a match. // In this case there will be a match whenever // both Get and Put have been invoked (get & put).Do((T t) => { Log.Trace("Match 'get & put': passing " + t + " from Put to Get"); return(t); }); }
public void CallAsyncMethod() { AsyncMethod async = new AsyncMethod(TestMethod); IAsyncResult ar = async.BeginInvoke(null, null);//不丟callback method,在此處理 DateTime startTime = DateTime.Now; Console.WriteLine("[CallAsyncMethod] ThreadId:{0}, startTime:{1}", System.Threading.Thread.CurrentThread.ManagedThreadId, startTime.ToString("HH:mm:ss.fff")); //輪詢非同步的作業狀態 while (!ar.IsCompleted) { //Console.WriteLine("...Control closed:{0} , Control valid:{1}", ar.AsyncWaitHandle.SafeWaitHandle.IsClosed, ar.AsyncWaitHandle.SafeWaitHandle.IsInvalid); Console.Write("."); System.Threading.Thread.Sleep(10); } Console.WriteLine(); //結束非同步方法的呼叫並回傳結果 string result = async.EndInvoke(ar); DateTime endTime = DateTime.Now; Console.WriteLine("Complete EndTime:{1} TimeSpend:{2}ms and Result:{0}", result, endTime.ToString("HH:mm:ss.fff"), (endTime - startTime).TotalMilliseconds); }
// true=成功,false=失败,null=取消 private async Task <bool?> _OpenAsync() { bool?result = null; bool?r = _OpenFileDialog.ShowDialog(); if (r ?? false) { result = await AsyncMethod.OpenAsync(_OpenFileDialog.FileName); } if (result ?? false) { Common.CurrentTaxon = Entrance.Root; _Saved = true; } return(result); }
void Update() { HashSet <string> blockingCategories = new HashSet <string>(); for (int i = 0; i < executingMethods.Count; i++) { AsyncMethod method = executingMethods[i]; if (blockingCategories.Contains(method.BlockingCategory)) { continue; } if (method.Update()) { executingMethods.RemoveAt(i--); } else if (method.BlockingCategory != null) { blockingCategories.Add(method.BlockingCategory); } } }
public BoundedSyncBuffer(int size) { #region initialization joiner = new Joiner(); put = joiner.NewSyncMethod <T>(Put); get = joiner.NewSyncMethod <T>(Get); emptySlot = joiner.NewAsyncMethod(EmptySlot); fullSlot = joiner.NewAsyncMethod <T>(FullSlot); #endregion (put & emptySlot).Do((T t) => { Log.Trace("Match 'put & emptySlot': passing " + t + " from Put to EmptySlot"); FullSlot(t); }); (get & fullSlot).Do((T t) => { Log.Trace("Match 'get & fullSlot': passing " + t + " from FullSlot to Get"); EmptySlot(); return(t); }); size.Times(() => EmptySlot()); }
// true=成功,false=失败 private async Task <bool> _CloseAsync() { Common.RightButtonTaxon = null; Common.SelectedTaxon = null; view_Search.ClearSearchResult(); view_Statistics.ClearStatisticsResult(); view_Validation.ClearValidateResult(); bool result = await AsyncMethod.CloseAsync(); if (result) { Common.CurrentTaxon = Entrance.Root; _Saved = false; } GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); return(result); }
public void Run() { _myOtherThread = new AsyncMethod(SomeMethod); _myOtherThread.BeginInvoke(CallBackMethod, null); }
public override void Create() { //this.mainWindow.Title = $"{this.profileViewModel.Name} ({this.profileViewModel.ChatId}) vs. {this.contactListManager.CurrentContact.Name} ({this.contactListManager.CurrentContact.ChatId})"; #region chat-view var chatViewFrame = new FrameView("Messages") { X = 0, Y = 1, Width = Dim.Percent(75), Height = Dim.Fill() - 5, }; this.listViewMessages = new ListView { X = 0, Y = 0, Width = Dim.Fill(), Height = Dim.Fill(), }; this.messageThreadView.SetListView(this.listViewMessages); chatViewFrame.Add(this.listViewMessages); this.mainWindow.Add(chatViewFrame); #endregion #region connections var frameViewConnections = new FrameView("Connections") { X = Pos.Right(chatViewFrame), Y = 1, Width = Dim.Fill(), Height = Dim.Percent(50f) }; this.listViewConnections = new ListView(this.connectionListEntries) { Width = Dim.Fill(), Height = Dim.Fill() }; this.listViewConnections.AllowsMarking = false; frameViewConnections.Add(this.listViewConnections); this.mainWindow.Add(frameViewConnections); #endregion #region online-user-list var userListFrame = new FrameView("Notifications") { X = Pos.Right(chatViewFrame), Y = Pos.Bottom(frameViewConnections), Width = Dim.Fill(), Height = Dim.Percent(50) }; var userList = new ListView(this.contactListManager.Contacts.Where(x => x.StaticPublicKey != null && x.ChatId != this.contactListManager.CurrentContact.ChatId).Select(x => x.ChatId).ToList()) { Width = Dim.Fill(), Height = Dim.Fill() }; userList.AllowsMarking = false; userListFrame.Add(userList); this.mainWindow.Add(userListFrame); #endregion #region chat-bar var chatBar = new FrameView(null) { X = 0, Y = Pos.Bottom(chatViewFrame), Width = chatViewFrame.Width, Height = 5 }; this.textFieldMessageText = new TextView() { X = 0, Y = 0, Width = Dim.Percent(85), Height = 3, CanFocus = true, }; var sendButton = new Button("Send", true) { X = Pos.Right(this.textFieldMessageText) + 1, Y = 0, Height = 1 }; sendButton.Clicked = () => { // work around a bug, where there contact selection triggers sending an empty message if (!this.firstEnterHandled) { this.firstEnterHandled = true; return; } _ = SendTextMessageAsync(); }; chatBar.Add(this.textFieldMessageText); chatBar.Add(sendButton); this.mainWindow.Add(chatBar); AsyncMethod.RunSync(this.messagesViewModel.InitializeThread); this.textFieldMessageText.SetFocus(); #endregion HotKeys.OnOpenFile = OnOpenFileAsync; OnViewReady(); }
// 检查并更新结果。 private async Task _ValidateAndUpdateResultAsync() { Taxon taxon = radioButton_Root.IsChecked ?? false ? Entrance.Root : Common.CurrentTaxon; AsyncMethod.Start(); await Task.Run(() => { _ValidateResult.Clear(); IReadOnlyDictionary <IValidator, IReadOnlyCollection <Taxon> > validateResult = taxon.ValidateChildrenAndGroupByValidator(); foreach (var pair in validateResult) { List <TaxonItem> items = new List <TaxonItem>(); foreach (var taxon in pair.Value) { items.Add(new TaxonItem() { Taxon = taxon }); } _ValidateResult.Add(new _ValidateResultItem() { Title = pair.Key.ToString(), TaxonItems = items }); } }); AsyncMethod.Finish(); stackPanel_ValidateResult.Children.Clear(); if (_ValidateResult.Count > 0) { foreach (var result in _ValidateResult) { CollapsibleTaxonButtonGroup taxonButtonGroup = new CollapsibleTaxonButtonGroup() { Title = result.Title, IsDarkTheme = Theme.IsDarkTheme, Margin = new Thickness(0, 25, 0, 0), }; taxonButtonGroup.UpdateContent(result.TaxonItems); taxonButtonGroup.MouseLeftButtonClick += (s, e) => { if (e.Taxon.IsRoot) { MessageBox.Show("该类群已经被删除。"); } else { Common.CurrentTabPage = Common.TabPage.Evo; Common.IsEditMode = true; Common.CurrentTaxon = e.Taxon; } }; result.TaxonButtonGroup = taxonButtonGroup; stackPanel_ValidateResult.Children.Add(taxonButtonGroup); } } _UpdateVisibility(); }
public MainWindowViewModel(AsyncMethod asyncMethod) : this(asyncMethod, new NameService(), DispatcherScheduler.Current) { }
public ReaderWriterLock() { #region initialization joiner = new Joiner(); getWriter = joiner.NewSyncMethod(GetWriter); releaseWriter = joiner.NewSyncMethod(ReleaseWriter); getReader = joiner.NewSyncMethod(GetReader); releaseReader = joiner.NewSyncMethod(ReleaseReader); idle = joiner.NewAsyncMethod(Idle); readers = joiner.NewAsyncMethod <int>(Readers); writer = joiner.NewAsyncMethod(Writer); #endregion (getWriter & idle).Do(() => { Writer(); }); (releaseWriter & readers).Do((int n) => { Readers(n); throw new Exception("Cannot release writer lock if not taken"); }); // getReader & idle => Readers(1); (releaseReader & idle).Do(() => { Idle(); throw new Exception("Cannot release reader lock if not taken"); }); //need a async Writer state, otherwise a call to releaseWriter will generate an idle... // releaseWriter & writer => Idle() (releaseWriter & writer).Do(() => { Log.Trace("Match 'releaseWriter & writer': idle"); Idle(); }); // getReader & idle => Readers(1); (getReader & idle).Do(() => { Log.Trace("Match 'getReader & idle': " + 1 + " readers"); Readers(1); }); // getReader & readers(n) => Readers(n+1); (getReader & readers).Do((int n) => { Log.Trace("Match 'getReader & readers': " + (n + 1) + " readers"); Readers(n + 1); }); // releaseReader & readers(n) => Readers(n-1); (releaseReader & readers).Do((int n) => { if (n == 1) { Log.Trace("Match 'releaseReader & readers': " + 0 + " readers"); Idle(); } else { Log.Trace("Match 'releaseReader & readers': " + (n - 1) + " readers"); Readers(n - 1); } }); //start state Idle(); }
public MainWindowViewModel(AsyncMethod asyncMethod, INameService service, IScheduler scheduler) { _service = service; _scheduler = scheduler; _asyncMethod = asyncMethod; }
// 搜索并更新结果。 private async Task _SearchAndUpdateResultAsync() { Taxon taxon = radioButton_Root.IsChecked ?? false ? Entrance.Root : Common.CurrentTaxon; string keyWord = ViewModel.KeyWord; AsyncMethod.Start(); await Task.Run(() => { _SearchResult.Clear(); IReadOnlyDictionary <MatchLevel, IReadOnlyList <Taxon> > searchResult = taxon.SearchAndGroupByMatchLevel(keyWord); IReadOnlyList <Taxon> perfect = searchResult[MatchLevel.Perfect]; IReadOnlyList <Taxon> high = searchResult[MatchLevel.High]; IReadOnlyList <Taxon> low = searchResult[MatchLevel.Low]; if (perfect.Count > 0) { List <TaxonItem> items = new List <TaxonItem>(); foreach (var taxon in perfect) { items.Add(new TaxonItem() { Taxon = taxon }); } _SearchResult.Add(new _SearchResultItem() { Title = "最相关结果", TaxonItems = items }); } if (high.Count > 0) { List <TaxonItem> items = new List <TaxonItem>(); foreach (var taxon in high) { items.Add(new TaxonItem() { Taxon = taxon }); } _SearchResult.Add(new _SearchResultItem() { Title = "较相关结果", TaxonItems = items }); } if (low.Count > 0) { List <TaxonItem> items = new List <TaxonItem>(); foreach (var taxon in low) { items.Add(new TaxonItem() { Taxon = taxon }); } _SearchResult.Add(new _SearchResultItem() { Title = "次相关结果", TaxonItems = items }); } }); AsyncMethod.Finish(); stackPanel_SearchResult.Children.Clear(); if (_SearchResult.Count > 0) { foreach (var result in _SearchResult) { CollapsibleTaxonButtonGroup taxonButtonGroup = new CollapsibleTaxonButtonGroup() { Title = result.Title, IsDarkTheme = Theme.IsDarkTheme, Margin = new Thickness(0, 25, 0, 0), }; taxonButtonGroup.UpdateContent(result.TaxonItems); taxonButtonGroup.MouseLeftButtonClick += (s, e) => { if (e.Taxon.IsRoot) { MessageBox.Show("该类群已经被删除。"); } else { Common.CurrentTabPage = Common.TabPage.Evo; Common.CurrentTaxon = e.Taxon; } }; result.TaxonButtonGroup = taxonButtonGroup; stackPanel_SearchResult.Children.Add(taxonButtonGroup); } const int preferShowCount = 10; int count = 0; foreach (var result in _SearchResult) { count += result.TaxonItems.Count; if (count <= preferShowCount) { result.TaxonButtonGroup.Expanded = true; } else { break; } } } _UpdateVisibility(); }
public FairReaderWriterLock() { #region initialization joiner = new Joiner(); getWriter = joiner.NewSyncMethod(GetWriter); releaseWriter = joiner.NewSyncMethod(ReleaseWriter); getReader = joiner.NewSyncMethod(GetReader); releaseReader = joiner.NewSyncMethod(ReleaseReader); idle = joiner.NewAsyncMethod(Idle); readers = joiner.NewAsyncMethod <int>(Readers); fewerReaders = joiner.NewAsyncMethod <int>(FewerReaders); zeroReader = joiner.NewSyncMethod(ZeroReader); idleWriter = joiner.NewAsyncMethod(IdleWriter); writer = joiner.NewAsyncMethod(Writer); #endregion (getWriter & idle).Do(() => { Writer(); }); (releaseWriter & writer).Do(() => { Idle(); }); (getReader & idle).Do(() => { Readers(1); }); (getReader & readers).Do((int n) => { Readers(n + 1); }); (releaseReader & readers).Do((int n) => { if (n == 1) { Idle(); } else { Readers(n - 1); } }); (getWriter & readers).Do((int n) => { FewerReaders(n); ZeroReader(); }); (zeroReader & idleWriter).Do(() => { Writer(); }); (releaseReader & fewerReaders).Do((int n) => { if (n == 1) { IdleWriter(); } else { FewerReaders(n - 1); } }); //start state Idle(); }