저는 며칠 전에 작업을 진행했으며 다중 스레드 및 BLOB 클라이언트에 관한 이전 질문을 읽고 제안 사항을 구현했습니다.작업 스레드와 Azure CloudBlobClient
아래에서 문제를 해결했습니다.
아무런 오류도 발생하지 않고 단지 threadtest 컨테이너 (이미 있음)에는 아무 것도 기록되지 않습니다. 때로는 하나의 얼룩이 쓰여지는 경우가 있습니다.
잠을 1 초로 늘리면 모든 것이 잘됩니다.
코드의 이유는 Azure의 BLOB 작성 기능을 벤치 마크하는 것입니다. (저는 현재 70 시간을하고 8 개 단일 스레드 인스턴스를 가지고있다하지만이 알아낼 수 있다면 그 이상 얻을 수 있습니다 나는 확신)
using System;
using System.Net;
using System.Threading;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.ServiceRuntime;
using Microsoft.WindowsAzure.StorageClient;
using System.Threading.Tasks;
namespace ThreadedWriterTest
{
public class WorkerRole : RoleEntryPoint
{
private static CloudStorageAccount storageAccount;
public override void Run()
{
while (true)
{
Thread.Sleep(10);
Task.Factory.StartNew(()=> writeStuff());
}
}
private void writeStuff()
{
CloudBlobClient threadClient = storageAccount.CreateCloudBlobClient();
threadClient.GetBlobReference("threadtest/" + Guid.NewGuid().ToString()).UploadText("Hello " + Guid.NewGuid().ToString());
}
public override bool OnStart()
{
ServicePointManager.DefaultConnectionLimit = 12;
storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("XXX"));
return base.OnStart();
}
}
}
while 루프에서 직접'writeStuff() '를 호출하면 작동합니다. –
만약 쓰기가 평균 10ms보다 오래 걸리면,'Task's가 기다리고있을 것입니다. 아마도 그것은 당신의 문제입니다 - 당신의 VM은 CPU 또는 메모리에 고정되어 있습니까? 사용 가능한 연결 당 하나의 스레드를 시작하는 것이 나을 것이고 각 스레드는 긴밀한 루프를 작성하는 것이 좋습니다. 또는 비표준 요청을 제어하기 위해 비동기 쓰기 메소드를 일부 메커니즘과 함께 사용하는 것이 더 좋습니다. –
당신이 자리하고 있습니다. 이 코드는 너무 많은 동시 스레드를 생성했습니다. 수를 제한하기 위해 세마포를 사용했으며 곧 솔루션을 게시 할 예정입니다. –