Bonjour,

Pour ceux qui ont un abonnement Azure ,
si vous developpez dans les Function App ,
c'est pour avertir que la directive c# 'lock' ne fonctionnera pas .
Otez plutot pour une machine virtuelle.

En tout cas ca ne marche pas pour les httptrigger
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log)
        {
}
 
{
lock (lockcache)
            {
//portion de code
}
Aussi c'est pour vous dire que dans Azure Emulator , cette directive fonctionne !


Vous êtes prevenues !

Merci de faire passer le message !

Pour moi j'ai perdu 4 jours de boulot !

Conclusion :
Function app fonctionne mais pas la directive 'lock' de dotnet ! au moins dans httptrigger.



Pardon j'ai la preuve ici que le lock se comporte mal !

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
 public static class FTest
    {
        static object testlock = new object();
        [FunctionName("FTest")]
        public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log)
        {
            string name;
            lock (testlock)
            {
 
                log.Info("C# HTTP trigger function processed a request BEGIN.");
                Thread.Sleep(8000);
                // parse query parameter
                //name = req.GetQueryNameValuePairs()
                //    .FirstOrDefault(q => string.Compare(q.Key, "name", true) == 0)
                //    .Value;
 
                //if (name == null)
                //{
                //    // Get request body
                //    //dynamic data = await req.Content.ReadAsAsync<object>();
                //    dynamic data = req.Content.ReadAsAsync<object>();
 
                //    name = data?.name;
                //}
                log.Info("C# HTTP trigger function processed a request END.");
            }
 
 
            return req.CreateResponse(HttpStatusCode.OK, "OK Access");
        }
    }
Coté client :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
static void Main(string[] args)
        {
 
 
 
            ServicePointManager.ServerCertificateValidationCallback =
            (object a, System.Security.Cryptography.X509Certificates.X509Certificate b, System.Security.Cryptography.X509Certificates.X509Chain c, System.Net.Security.SslPolicyErrors d) => { return true; };
            //var url = "https://progiscadap-testslot1.azurewebsites.net/api/FTest";
 
            for (int i = 0; i<4;i++)
            {
                Thread at = new Thread(TestWeb);
                at.Start();
            }
 
            Console.ReadLine();
        }
 private static void TestWeb()
        {
            var url = "https://myazure-tests1.azurewebsites.net/api/FTest";
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
 
            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
            StreamReader sr = new StreamReader(resp.GetResponseStream());
            string results = sr.ReadToEnd();
            results = results.Replace("\"", string.Empty);
 
            sr.Close();
            Console.WriteLine(results);
        }
Merci de ne pas mettre une valeur trop haute dans la ligne for (int i = 0; i<4;i++).

Plus grave : Rien sur Google .... personne n'est au courant !