コード例 #1
0
        public WaitForMany(int n)
        {
            wait   = joiner.NewSyncMethod(Wait);
            signal = joiner.NewAsyncMethod(Signal);

            (wait & n * signal).Do(() => { });
        }
コード例 #2
0
 /// <summary>
 /// 非同期実行。
 /// </summary>
 /// <param name="method">非同期メソッド。</param>
 public void Execute(AsyncMethod method)
 {
     _invokeCount++;
     this.BeginInvoke((MethodInvoker) delegate
     {
         method();
         _invokeCount--;
         if (_isCloseMode && _invokeCount == 0)
         {
             DisposeCore();
         }
     });
 }
コード例 #3
0
        // 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);
        }
コード例 #4
0
        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);
            });
        }
コード例 #5
0
        // 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);
        }
コード例 #6
0
        /// <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);
            }
        }
コード例 #7
0
        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);
            });
        }
コード例 #8
0
 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);
 }
コード例 #9
0
        // 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);
        }
コード例 #10
0
ファイル: Interpreter.cs プロジェクト: thomaswp/Farmbot
        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);
                }
            }
        }
コード例 #11
0
        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);
        }
コード例 #12
0
        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());
        }
コード例 #13
0
        // 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);
        }
コード例 #14
0
        public void Run()
        {            
            _myOtherThread = new AsyncMethod(SomeMethod);

            _myOtherThread.BeginInvoke(CallBackMethod, null);            
        }
コード例 #15
0
        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();
        }
コード例 #16
0
        // 检查并更新结果。
        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();
        }
コード例 #17
0
 public MainWindowViewModel(AsyncMethod asyncMethod)
     : this(asyncMethod, new NameService(), DispatcherScheduler.Current)
 { }
コード例 #18
0
        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();
        }
コード例 #19
0
 public MainWindowViewModel(AsyncMethod asyncMethod, INameService service, IScheduler scheduler)
 {
     _service = service;
     _scheduler = scheduler;
     _asyncMethod = asyncMethod;
 }
コード例 #20
0
        // 搜索并更新结果。
        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();
        }
コード例 #21
0
        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();
        }