我正在开发一个多线程WindowsPhone8应用程序,它在异步方法中有关键部分.
有没有人知道在C#中正确使用信号量/互斥量的方法,你在使用嵌套的异步调用,其中内部方法可能获取它已经获取了调用堆栈的相同锁?我认为SemaphoreSlim可能是答案,但看起来它会导致死锁.
public class Foo
{
SemaphoreSlim _lock = new SemaphoreSlim(1);
public async Task Bar()
{
await _lock.WaitAsync();
await BarInternal();
_lock.Release();
}
public async Task BarInternal()
{
await _lock.WaitAsync(); // deadlock
// DO work
_lock.Release();
}
}
Run Code Online (Sandbox Code Playgroud) 我正在开发一个C#WinRT应用程序,它向Web服务器发出POST和GET请求.
有没有人知道在使用HttpClient对象时是否有办法获取响应URI /地址?
如果我使用HttpWebRequest/HttpWebResponse类,那么我可以获取此信息(通过HttpWebResponse中的ResponseUri属性),但我没有看到如何使用HttpClient/HttpResponseMessage类获取它.
谢谢
我使用 azure blob 存储来存储 JSON 文件,并在我的代码中使用 C# API 下载它。
当我下载文本文件的内容并尝试使用 JsonConvert 对其进行反序列化时,出现错误(Visual Studio JSON 可视化工具也显示文本错误)。但是,如果我复制文本并粘贴到 JSONLint.com 中,它看起来很好。此外,如果我从 Azure 存储手动下载文件并在代码中读取文件,它反序列化就好了。有什么想法为什么我在使用 C# API 下载时得到无效数据?
var storageAccount = CloudStorageAccount.Parse(connectionString);
var blobClient = storageAccount.CreateCloudBlobClient();
var container = blobClient.GetContainerReference(containerName);
var blob = container.GetBlockBlobReference(folderAndFileName);
var text = await blob.DownloadTextAsync();
var obj = JsonConvert.DeserializeObject(text);
// Exception: "Unexpected character encountered while parsing value: . Path '', line 0, position 0."
Run Code Online (Sandbox Code Playgroud)
注意:我正在通过 Powershell 上传文件:
$blobProperties = @{"ContentType" = "application/json"};
Set-AzureStorageBlobContent -Container $containerName -File $LocalFilePath -Blob $RemoteBlobName -BlobType "Block" -Properties …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个为客户管理azure资源的应用程序(配置VM,创建VNets).
我们在azure门户中创建了一个多租户应用程序,该应用程序配置为Windows Azure Service Management API和Windows Azure Active Directory的委派权限.
我们可以毫无问题地登录基于AAD的帐户.但是当基于live.com的帐户登录时,用户会收到AADSTS50020错误.
我们登录时,我们 使用以下参数导航到https://login.microsoftonline.com/common/OAuth2/Authorize:
client_id=XXX&response_mode=query&response_type=code&redirect_uri=XXX&prompt=consent
Run Code Online (Sandbox Code Playgroud)
这是完整的错误消息:
AADSTS50020:来自身份提供商'live.com'的用户帐户'xxx@hotmail.com'在租户'XXX'中不存在,并且无法访问该租户中的应用程序'xxx'.该帐户需要首先作为外部用户添加到租户中.注销并使用其他Azure Active Directory用户帐户重新登录.
我遇到了一个问题,我试图将CloudPageBlob复制到另一个Azure订阅中的存储帐户.出于某种原因,当我进行复制调用时,我一直收到404错误:
CloudBlobContainer destContainer;
CloudBlob sourceBlob;
string destBlobName;
var sourcePageBlob = sourceBlob as CloudPageBlob;
if (sourcePageBlob != null)
{
var destBlob = destContainer.GetPageBlobReference(destBlobName);
await destBlob.StartCopyAsync(sourcePageBlob, AccessCondition.GenerateIfExistsCondition(), AccessCondition.GenerateEmptyCondition(), new BlobRequestOptions(), new OperationContext());
return destBlob;
}
Run Code Online (Sandbox Code Playgroud)
调用返回{"The remote server returned an error: (404) Not Found."}
但是如果我调用sourcePageBlob.Exists()
它返回true
.
我有一些C#代码将Blob从一个存储帐户复制到另一个。我注意到,当我调用时CloudBlob.StartCopyAsync
,目标Blob的CopyState.Status
设置为CopyStatus.Pending
。有什么方法可以使我获得复制操作的更新状态?
我曾尝试await Task.Delay(TimeSpan.FromSeconds(10));
在通话后添加a ,但延迟结束后,状态仍显示为待定。如果然后尝试从存储容器中重新获取Blob,则会得到CopyStatus == null
。