使用Azure WebJobs调用静态方法

问题描述:

我创建了一个由静态class组成的dll。我将它们引用到我创建并部署在Azure中的web-jobs(webjob1,webjob2等)中。使用Azure WebJobs调用静态方法

每个Web作业都可以同时访问一个方法。当我们使用静态类时,它将在堆中创建单个内存。每个Web作业都包含该静态类的参考值。我的问题是,它会产生任何问题吗?

根据我的理解,C#以同步方式工作。因此,每个Web作业都将在队列中等待以访问静态类的功能。因此,对该静态类的变量进行的任何更改都会反映在其他Webjob上。由于静态类具有独立的内存。

如果我的假设是正确的,为什么我们应该保留这样的静态助手类,而不是正常的,我们可以实例化和使用它。

我正在创建这样的静态类,以便从我的数据库中获取一些细节。

public static class StaticHelper 
    { 
     public static string GetValue() 
     { 
      using(IDBContext _DbContext = new sampleDBContext()) 
      { 

      } 

      //Acessing values through this context 
     } 
    } 
+0

确实取决于你试图达到的目标。 C#也有异步/等待模式。如果你可以在这里发布你的代码会更容易。干杯。 – Thomas

+0

@Thomas已更新... – Skull

+0

Webjobs不会等待访问您的静态方法。他们将同时调用它。 – Thomas

如果我理解正确,你有多个webjobs具有相同的依赖关系的dll。您有该网站的多个实例,并使用SDK而不是队列触发器。

每个webjob都将作为自己的进程运行,并且网站的每个实例都可能具有这些webjob的其他实例(取决于您是否设置了单个实例或多个实例)。

“每个网络作业都可以同时访问一个方法” - 是的,但是它们将处于不同的过程中,因此在这种情况下您将是安全的。

如果回答你的问题,更多的细节是真正了解.net和多个进程如何处理静态逻辑(不是特定的webjobs)。我会从杰弗里·里希特开始学习这个细节。

+0

我需要你的回答更多的澄清...因为你提到webjobs作为一个进程工作,每个webjobs将创建自己的内存,并有自己的静态类实例(指静态类的内存分配在进程内存(webjob内存)),所以它会被认为safe.is是正确的? – Skull

+0

通过查看Kudu代码,它在我看来就像webjob获得全新的cmd.exe过程。 Webjob目录被设置为ProcessStartInfo,包装并启动。这导致我相信网站和webjobs之间没有共享内存。 ProcessWrapper.cs封装了底层Process,并开始使用这个类:https://github.com/projectkudu/kudu/blob/master/Kudu.Core/Infrastructure/ProcessWrapper.cs。该过程是在Executable.cs类方法CreateProcess()中创建的https://github.com/projectkudu/kudu/blob/master/Kudu.Core/Infrastructure/Executable.cs –

+0

非常感谢你......你是对的每个webjobs都在不同的进程中运行,所以它将是线程安全的。 – Skull

每个WebJob都在自己的进程中运行,这与WebApp的进程(w3wp)不同。所以他们每个人都有自己的静态变量副本。

IS Azure Webjobs have its own memory allocation?