Apeluri asincrone

În acest articol voi arăta implementarea apelurilor asincrone la funcțiile și procedurile serverului

Principalul avantaj al apelurilor asincrone înainte de apelurile sincrone este că nu blochează interfața cu utilizatorul. Dacă inițiați în mod sincron o procedură sau o funcție care continuă să efectueze anumite acțiuni, atunci interfața dvs. de utilizator nu va fi disponibilă pentru acest moment.







Puteți spune că construirea raportului în fundal (Rezultat de construire (Modul formularului de rezultate, fundal)) și există un apel asincron. Adevărul aici este de a face o rezervare care totuși este doar o emulare a unui apel asincron, precum și o implementare pe care o voi arăta.

1. Aplicații convenționale și gestionate

2. Modul client-server și fișier

3. Executarea asincronă a procedurilor și funcțiilor serverului

4. Obținerea valorii returnate de funcție

5. Primirea unei descrieri a erorii care a avut loc

6. Anulați un apel asincron

7. Monitorizarea terminării unui apel asincron

8. Urmărirea progresului unui apel asincron

Cerințe pentru funcțiile și procedurile asincron numite

Funcțiile și procedurile numite asincron trebuie exportate și pot fi în următoarele module:

- Module ale administratorilor de obiecte

- Module comune partajate de servere globale și non-globale

Parametrii în aceste funcții și proceduri ar trebui să poată fi transferați de la client la server. Valorile returnate în aceste funcții trebuie să poată fi transferate de la server la client.

De fapt, puteți spune că cerințele sunt aceleași ca și pentru funcțiile și procedurile care sunt în modulele de server comune cu semnul apelului server.

Modul comun Apel asincron

Acest modul conține procedurile și funcțiile interfeței programului pentru apeluri asincrone. Numai cu acest modul va trebui să lucrați când efectuați apeluri asincrone.

Interfața programului constă în următoarele proceduri și funcții:

În jurul acestei structuri au loc toate acțiunile - toate informațiile despre apelul asincron sunt stocate în acesta.

Proprietăți constante:
Identificator - identificator al unui apel asincron (după identificatorul lucrării de fundal)
Nume de Funcție sau Procedură - numele complet calificat al funcției sau procedurii serverului
Această funcție este un semn că funcția a fost pornită și valoarea returnată
Parametrii - o serie de parametri pe care i-am trecut printr-un apel asincron către o funcție sau o procedură
Formularul - o formă în modulul căruia există manipulatori de proceduri
Numele Terminatorului este numele procedurii de export în forma care va procesa finalizarea apelului asincron
Numele manipulatorului din numele execuției este numele procedurii de export sub forma formularului care va gestiona executarea apelului asincron
Auto-respinge prin - numărul de secunde prin care doriți să anulați automat apelul asincron
StartB - timpul pentru a porni un apel asincron
Context - orice informație suplimentară care poate fi asociată unui apel asincron

Proprietăți modificate:
Stare - starea unui apel asincron (Activ, Complet, Anulat, CompletedFault)
Valoarea returnată este valoarea returnată de funcție (pentru procedurile în care această proprietate nu este prezentă)
Valoarea valorii Execute este valoarea progresului, de exemplu, procentul de finalizare
MessageFlow - toate mesajele pe care le-a trecut funcția sau procedura asincron numite
Descrierea erorilor - o descriere a erorii care a avut loc în timpul unui apel asincron

Nu aveți nevoie să modificați singuri valorile din această structură.

Procedură sau procedură asincronă

Puteți apela procedura sau funcția asincron numai de la client. Pentru aceasta, sunt utilizate două funcții: Funcția de apel și Procedura de apel. Ambii îi returnează structura provocării asincrone. Dar nu puteți procesa rezultatul pe care îl returnează dacă utilizați agenți de manipulare sau nu doriți să monitorizați soarta apelului.







Aici este cel mai simplu apel asincron:

Dacă procedura sau funcția are parametri de intrare, atunci apelul va arăta astfel:

Anularea unui apel asincron

Un apel asincron poate fi anulat manual, după cum urmează:

Ca parametru, puteți transfera o structură AsynchronousCall, un identificator unic de apel, un șir care conține un identificator de apel unic sau un Array care poate conține toate cele listate anterior.

Puteți anula toate apelurile asincrone simultan, astfel:

În acest caz, putem spune că în ambele exemple de mai sus, apelul de anulare în sine este asincron, adică După finalizarea acestuia, starea apelului asincron nu se schimbă imediat.

De asemenea, un apel asincron poate fi anulat automat după o anumită perioadă de timp, după cum urmează:

Monitorizarea terminării unui apel asincron

Pentru a urmări momentul când apelul asincron este întrerupt (în mod normal, cu o eroare sau va fi anulat), trebuie să faceți următoarele.

În primul rând, trebuie să implementați procedura de tratare a terminării apelurilor asincrone.

Pentru o formă obișnuită și o procedură invocată asincron, manipulatorul va arăta astfel:

Pentru o formă gestionată și o funcție invocată asincron, manipulatorul va arăta astfel:

Numele manipulatorului ales de tine.

În al doilea rând, trebuie să trimiteți, într-un apel asincron, parametrii formularul de apel și numele handlerului de ieșire din modulul acestui formular, așa cum este cazul:

Când apelul asincron se termină (în mod normal, cu o eroare sau va fi anulat), se va apela interfața noastră de terminare.

Puteți afla despre finalizarea unui apel asincron fără conexiunea unui handler de terminare. Pentru a face acest lucru, trebuie să salvați structura de apel asincron, care este returnată de funcția Apelați funcția și apelați procedura și periodic sau prin apăsarea butonului verificați valoarea proprietății statului.

Urmărirea progresului unui apel asincron

Un apel asincron poate fi executat pentru o lungă perioadă de timp și uneori ar fi de dorit să înțelegeți câți au fost deja executați, care au fost deja executați și așa mai departe.

Pentru a rezolva această problemă, am introdus două termeni: valoarea progresului și raportul de progres.

Valoarea progresului este valoarea care caracterizează completitudinea apelului asincron. Acesta poate fi procentul execuției, numărul de obiecte create. Și nu trebuie să fie un număr, poate fi o structură care conține mai multe valori și nu neapărat valori numerice.

Mesajele de progres sunt mesaje care pot ajuta la înțelegerea a ceea ce sa realizat deja. Aceasta poate fi înregistrarea apelurilor asincrone sau câteva mesaje importante pentru utilizator. Și nu trebuie să fie un șir, poate fi o structură care conține mai multe valori și nu neapărat șir.

Valorile și mesajele de progres sunt lucruri diferite. Valoarea la fiecare moment este doar una, dar pot exista multe mesaje.

Pentru a putea gestiona mesajele de valoare și de progres, o funcție sau o procedură care se numește asincron trebuie să o transmită într-un mod special. Pentru a face acest lucru, ați implementat două proceduri: Actualizați valoarea executării și adăugați un mesaj din codul de execuție.

Aproximativ aici pentru a putea fi folosite:

Deci, dacă funcția sau procedura dvs. este apelată în mod asincron, actualizează valoarea sau adaugă mesaje de progres, le puteți urmări. Pentru a face acest lucru, trebuie să faceți următoarele.

În primul rând, trebuie să implementați un handler de apel asincron. Pentru forma obișnuită va arăta astfel:

Numele manipulatorului ales de tine.

În al doilea rând, într-un apel asincron, trebuie să treci parametrii formularului de apel și numele procesatorului de timp de la modulul acestui formular, după cum urmează:

Instrumentul de procesare a run-time va fi apelat atunci când valoarea progresului este actualizată sau au apărut mesaje noi de progres.

Puteți afla despre desfășurarea unui apel asincron fără conexiunea unui handler cu timp de execuție. Pentru a face acest lucru, ar trebui să păstreze structura AsinhronnyyVyzov, care este returnat funcția VyzvatFunktsiyu și VyzvatProtseduru, periodic sau la simpla apăsare a unui buton pentru a verifica valoarea proprietăților și ZnachenieHodaVypolneniya SoobscheniyaHodaVypolneniya. Dacă doriți să vedeți numai mesaje noi care nu au fost încă procesate de dvs., atunci trebuie să le ștergeți.

În configurația demo Asynchronous Call.cf veți găsi un exemplu pentru o aplicație obișnuită.

Apeluri asincrone

Și pentru o aplicație gestionată.

Apeluri asincrone

Pexe - e interesant.

Putem spune că întreaga implementare se bazează pe următoarele:

- Lucrările de fundal și metoda Obțineți mesajul către utilizator

- Operatorul global de așteptare

- Serializarea / Deserializarea cu ValueVChapterV.Instance / ValueStringVar

Pentru mai multe detalii, puteți să vă uitați întotdeauna la implementarea în AsynchronousCalls.cf

Pentru a implementa configurația, trebuie să transferați 4 module comune:

De asemenea, adăugați variabila de export Apeluri asincrone neterminate la aplicațiile gestionate și normale.

Sper că materialul descris în articol va fi util pentru dvs.

Vă mulțumesc pentru atenție.







Articole similare

Trimiteți-le prietenilor: